XMLデータのエスケープ処理
2 posters
XMLデータのエスケープ処理
DOM Parse XML sourceでRSSのURLから読み込もうとしたXMLデータ(テキスト)がなぜかエラーになるので調べてみたら、文字列データのアンパサンド(&)で引っかかってた。
調べてみたらエスケープしないといけないらしい。
どうやってエスエープすればよいのでしょうか?
単純に
$xml_t:=Replace string($xml_t;"&";"&")
はまずいですよね。
調べてみたらエスケープしないといけないらしい。
どうやってエスエープすればよいのでしょうか?
単純に
$xml_t:=Replace string($xml_t;"&";"&")
はまずいですよね。
hosaka- 投稿数 : 247
登録日 : 2016/07/04
所在地 : 大阪
Re: XMLデータのエスケープ処理
仕方がないので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の扱いはコピーされたデータとなって対象コレクションに反映されないみたいです。
使用上仕方がないのかもしれませんがこれは変だと思う。 ドキュメントよく読んでないとバグだと考えますよね。
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の扱いはコピーされたデータとなって対象コレクションに反映されないみたいです。
使用上仕方がないのかもしれませんがこれは変だと思う。 ドキュメントよく読んでないとバグだと考えますよね。
hosaka- 投稿数 : 247
登録日 : 2016/07/04
所在地 : 大阪
Re: XMLデータのエスケープ処理
$this:=Replace string($this;"&";"&")のところをPROCESS 4D TAGSに置き換えてみました。
他のエスケープしないといけない文字もあったので、自分で書くより優秀だろうと考えたのですが...
「&」の処理がまずいみたいです。「&」などとなっているところを再度処理してしまいます。「&」となりました。
これでは一応エスケープされていると思うけど念のため処理することができません。
他のエスケープしないといけない文字もあったので、自分で書くより優秀だろうと考えたのですが...
「&」の処理がまずいみたいです。「&」などとなっているところを再度処理してしまいます。「&」となりました。
これでは一応エスケープされていると思うけど念のため処理することができません。
hosaka- 投稿数 : 247
登録日 : 2016/07/04
所在地 : 大阪
Re: XMLデータのエスケープ処理
コレクションの各要素を「処理」して内容を変更するときは,
各要素を置換する:collection.map()
map()は要素を$0.resultで置き換えます。
新コレクションを作成する:collection.reduce()
reduce()の中で$0.accumulator.push()を任意の回数,使用することができます。
要素数を増やすこともできます。
New collectionではなく,New objectを元にすることもできます。
コレクション・プログラミングでは,
For each
map()
reduce()
を同程度に多用することになる,と個人的に思います。
各要素を置換する:collection.map()
map()は要素を$0.resultで置き換えます。
新コレクションを作成する:collection.reduce()
reduce()の中で$0.accumulator.push()を任意の回数,使用することができます。
要素数を増やすこともできます。
New collectionではなく,New objectを元にすることもできます。
コレクション・プログラミングでは,
For each
map()
reduce()
を同程度に多用することになる,と個人的に思います。
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: XMLデータのエスケープ処理
4Dタグについてですが,
4DTEXT/4DHTMLは,処理できる4Dタグが無くなるまで再帰的に処理するのに対し,
4DEVALは一度だけ処理する,という特性があります。
http://doc.4d.com/4Dv16/4D/16/4D-Transformation-Tags.300-3035918.ja.html
ただ,今回の件は,元のRSSデータが正しいXMLではない(ということで合っているでしょうか)という問題が発端にあるので,いずれにしても,役には立たないかもしれません。
4DTEXT/4DHTMLは,処理できる4Dタグが無くなるまで再帰的に処理するのに対し,
4DEVALは一度だけ処理する,という特性があります。
http://doc.4d.com/4Dv16/4D/16/4D-Transformation-Tags.300-3035918.ja.html
ただ,今回の件は,元のRSSデータが正しいXMLではない(ということで合っているでしょうか)という問題が発端にあるので,いずれにしても,役には立たないかもしれません。
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: XMLデータのエスケープ処理
コレクションの内容を変更する処理についてはいろいろあるのはわかります。
ただ一般的(他言語)なFor each文がコレクション(配列)要素に対して処理をするものだと考えられるのでこの仕様はいただけないと思います。
個人的には、スカラー値の場合には要素のポインタである方がしっくりくるのではないかと思います。
4Dタグについてですが、利用したのは4DTEXTです。
自動的にエスケープされると書いてあったからなのですが、'&'についてすでにエスケープされている場合を考慮していないだけなので
この部分を考慮していただければ問題ないと思いますよ。
ただ一般的(他言語)なFor each文がコレクション(配列)要素に対して処理をするものだと考えられるのでこの仕様はいただけないと思います。
個人的には、スカラー値の場合には要素のポインタである方がしっくりくるのではないかと思います。
4Dタグについてですが、利用したのは4DTEXTです。
自動的にエスケープされると書いてあったからなのですが、'&'についてすでにエスケープされている場合を考慮していないだけなので
この部分を考慮していただければ問題ないと思いますよ。
hosaka- 投稿数 : 247
登録日 : 2016/07/04
所在地 : 大阪
Permissions in this forum:
返信投稿: 不可