XMLデータのエスケープ処理

Go down

XMLデータのエスケープ処理

投稿 by hosaka on 2018-10-02, 12:35 pm

DOM Parse XML sourceでRSSのURLから読み込もうとしたXMLデータ(テキスト)がなぜかエラーになるので調べてみたら、文字列データのアンパサンド(&)で引っかかってた。
調べてみたらエスケープしないといけないらしい。


どうやってエスエープすればよいのでしょうか?
単純に

$xml_t:=Replace string($xml_t;"&";"&")

はまずいですよね。 Crying or Very sad
avatar
hosaka

投稿数 : 130
登録日 : 2016/07/04
所在地 : 大阪

トップに戻る Go down

Re: XMLデータのエスケープ処理

投稿 by hosaka on 2018-10-02, 2:25 pm

仕方がないのでXMLデータをパーツに分割してエスケープする事にしました。

For each($this;$xml_c)
$match_b:=Match regex($pattern_t;$this;1)
If ($match_b=False)  //タグではないデータ
$this:=Replace string($this;"&";"&")
End if
End for each

としてみたのですがデータが書き換わりません。

For eachのドキュメントを読んでみるとコレクションの要素がスカラー値の場合のみ
$thisの扱いはコピーされたデータとなって対象コレクションに反映されないみたいです。

使用上仕方がないのかもしれませんがこれは変だと思う。 ドキュメントよく読んでないとバグだと考えますよね。Crying or Very sad
avatar
hosaka

投稿数 : 130
登録日 : 2016/07/04
所在地 : 大阪

トップに戻る Go down

Re: XMLデータのエスケープ処理

投稿 by hosaka on 2018-10-03, 10:18 am

$this:=Replace string($this;"&";"&")のところをPROCESS 4D TAGSに置き換えてみました。
他のエスケープしないといけない文字もあったので、自分で書くより優秀だろうと考えたのですが...

「&」の処理がまずいみたいです。「&」などとなっているところを再度処理してしまいます。「&」となりました。
これでは一応エスケープされていると思うけど念のため処理することができません。
avatar
hosaka

投稿数 : 130
登録日 : 2016/07/04
所在地 : 大阪

トップに戻る Go down

Re: XMLデータのエスケープ処理

投稿 by miyako on 2018-10-09, 8:20 am

コレクションの各要素を「処理」して内容を変更するときは,

各要素を置換する:collection.map()

map()は要素を$0.resultで置き換えます。

新コレクションを作成する:collection.reduce()

reduce()の中で$0.accumulator.push()を任意の回数,使用することができます。
要素数を増やすこともできます。
New collectionではなく,New objectを元にすることもできます。

コレクション・プログラミングでは,

For each
map()
reduce()

を同程度に多用することになる,と個人的に思います。

miyako

投稿数 : 281
登録日 : 2016/07/05

トップに戻る Go down

Re: XMLデータのエスケープ処理

投稿 by miyako on 2018-10-09, 8:27 am

4Dタグについてですが,

4DTEXT/4DHTMLは,処理できる4Dタグが無くなるまで再帰的に処理するのに対し,
4DEVALは一度だけ処理する,という特性があります。

http://doc.4d.com/4Dv16/4D/16/4D-Transformation-Tags.300-3035918.ja.html

ただ,今回の件は,元のRSSデータが正しいXMLではない(ということで合っているでしょうか)という問題が発端にあるので,いずれにしても,役には立たないかもしれません。

miyako

投稿数 : 281
登録日 : 2016/07/05

トップに戻る Go down

Re: XMLデータのエスケープ処理

投稿 by hosaka on 2018-10-09, 9:11 am

コレクションの内容を変更する処理についてはいろいろあるのはわかります。
ただ一般的(他言語)なFor each文がコレクション(配列)要素に対して処理をするものだと考えられるのでこの仕様はいただけないと思います。 Crying or Very sad
個人的には、スカラー値の場合には要素のポインタである方がしっくりくるのではないかと思います。

4Dタグについてですが、利用したのは4DTEXTです。
自動的にエスケープされると書いてあったからなのですが、'&'についてすでにエスケープされている場合を考慮していないだけなので
この部分を考慮していただければ問題ないと思いますよ。
avatar
hosaka

投稿数 : 130
登録日 : 2016/07/04
所在地 : 大阪

トップに戻る Go down

Re: XMLデータのエスケープ処理

投稿 by Sponsored content


Sponsored content


トップに戻る Go down

トップに戻る


 
Permissions in this forum:
返信投稿: 不可