- - PR -
XML内の改行、空白について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-04-28 14:04
メソッドの引数に変換を行いたい属性名とその属性値を指定して、 各ノードに対して、その属性名が見つかるまで検索し、 見つかれば、引数で与えた属性値で、上書きすると言う処理です。 確かに、テキストや属性値に改行コード( CR + LF)が入っています。 <a bbb=1234 5678> のような感じです。(XMLファイル) それを、Saveメソッドで保存した後、XMLファイルをのぞいて見ると、 <a bbb=1234&#xD;&#xA;5678> のようになっているのです。 これは、XmlDocumentクラスまたは、DOM(?)の仕様(正常)なのでしょうか? | ||||||||
|
投稿日時: 2006-04-28 14:43
> これは、XmlDocumentクラスまたは、DOM(?)の仕様(正常)なのでしょうか?
はい、正常な動作です。その保存後のXML文書をもう一度ロードしてプログラム中からbbbの属性値を取ると、正しく「1234 CR LF 5678」になります。 XML文書上での改行は CR LF だろうが CR だろうが DOM 上では必ず LF のみになるので、CR LF を正しく保存するために文字参照「&#xD;&#xA;」になるんでしょう。 | ||||||||
|
投稿日時: 2006-04-28 15:43
@IT > XML & SOA > やさしく読む「XML 1.0勧告」
第19回 落とし穴が潜む属性値の正規化 http://www.atmarkit.co.jp/fxml/rensai/w3cread19/w3cread19.html ----------------------- 引用符で囲われる → 文字列リテラル じゃなく、 空白区切りの token の並び。 という、 コンセプト らしいです。 [ メッセージ編集済み 編集者: MMX 編集日時 2006-04-29 22:01 ] | ||||||||
|
投稿日時: 2006-04-28 15:53
なるほど。<正常 であれば、一度書き換えられてしまった、XMLファイルをCR+LFに 戻したいのであれば、XMLファイルをテキストファイルとして読み込み、 「&#xD;&#xA;」を 「CR+LF」に 置換をして、再度、保存するなどをしないといけないのでしょうか? | ||||||||
|
投稿日時: 2006-04-28 17:25
いいえ。それをやると、次にパーズしたときに得られる値が「1234 LF 5678」になります。(MMXさんが挙げられた「属性値の正規化」) 値として欲しいのが「1234 CR LF 5678」で正しいのなら、「&#xD;&#xA;」のままで正しいです。XML文書として見たときにどのような表現になってるかを気にする必要はありません。 | ||||||||
|
投稿日時: 2006-04-28 17:38
MMXさんが挙げられたリンクには
と書かれています。 なので、るぷ犬さんが作成したツールではなく、 XMLを正しく処理できていないシステム側に問題があるのではないでしょうか? 不具合のあるシステムで不具合が表面化しないように、ツール側が不正なXMLを生成する。 というのは何か違う気がします。 とりあえず、言えるだけ言ってみては? それでもダメだったら、るぷ太さんの仰るとおり変換するしかないでしょう。 | ||||||||
|
投稿日時: 2006-05-02 11:30
みなさん、お返事ありがとうございます。
>MMXさん なかなか、理解するのが遅いもので…。 通して読んだだけでは、わからなかったので、熟読したいと思います。 しかし、 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー a="(復帰)(改行)(復帰)(改行)xyz" この属性値は、まず「2.11 End-of-Line Handling(2.11 行末の取扱い)」 (第12回 XMLにおける空白、行末、言語識別)のルールに従い、 (復帰)(改行)が1個の(改行)に置き換えられる。この時点での内容は以下のようになる。 "(改行)(改行)xyz" そして、改行文字はスペース文字に置き換える属性の正規化が行われることにより、 以下のような内容に置き換えられる。 "(スペース文字)(スペース文字)xyz" ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 復帰+改行が改行だけになるのはわかるのですが、 (XMLパーサの解析でそうなるわけですよね? スペースになる理由がよくわかりません…。(汗) スペースにすると、意味が変わってくるような…。 むしろ、文字列をスペース区切りにするっていうことなのでしょうか…。 >スフレさん 要件としては、XMLファイルのある部分を置換するツールを作成するということなのですが、 そのツールを使用し、 <a bbb=1234 5678> だったものが、 同じXMLファイルの別部分の書き換え、保存しただけで、 <a bbb=1234&#xD;&#xA;5678> のように、直接関係無いところが、変わってしまうのは、 そのツール(私が作成したツール)は大丈夫?って言われたもので…。 たしかに、動作的にはそのXMLファイルを使用して、正常に動いていたようなのですがね…。 >うにくまさん いいえ、反対にシステム上でも正常に処理しているのです。(『&#xD;&#xA;』でも) それゆえ、 <a bbb=1234 5678> が、 <a bbb=1234&#xD;&#xA;5678> に、なっていることに気がつかなかったのですが…。 正常に処理しているからいいということではなく、 書き換わっていて、大丈夫かどうか、それがXMLの仕様(?)なら、 いいのですが…。(仕様なら言い切れるので。) | ||||||||
|
投稿日時: 2006-05-03 01:57
歴史的、SGML以来の属性値の 「用法」からそうでしょう。
ヒントはテキストの「欧文処理」かな、欧文扱いはあらゆるソフトにひそんでいます。word(token) が spaceで区切られて並んでいる。 空白類は文字というよりも区切りの制御記号と「みなす」、それ自体に情報は持たない。 常用の場面では shell のコマンド入力での引数間の空白とか 入力欄の前後の不要な空白とか 文では空白が必要で 式では空白は無視とか Word や HTML で行頭行末の 連続空白の扱い、とか ------------------------------ ファイル比較の diff でも連続空白の数は無視するほうが、使いやすい。 ー--------------- &# に変化する理由は知りません --------- xmlの中にxmlを埋め込もうとする場合、文字参照化になりがちです、 RSS での事例では。調子はよくないとか micorformats とかもあるそうです。 ----------------------------------------- 参考 xmlにhtmlを埋め込む方法、属性値でなく 1.要素内容に CDATAセクションで入れる。ただ、 CDATAセクションは入れ子にできない 2.htmlのオミットタグをノーマライズしてxml化して埋め込む。埋め込んだ形のxmlを検証する場合、めんどうかも。 [ メッセージ編集済み 編集者: MMX 編集日時 2006-05-10 00:14 ] |