- PR -

XML内の改行、空白について

投稿者投稿内容
るぷ犬
常連さん
会議室デビュー日: 2004/11/10
投稿数: 46
投稿日時: 2006-04-28 14:04
引用:

スフレさんの書き込み (2006-04-28 12:39) より:
引用:

XmlDocumentクラスを使用し、対象のXMLファイルを、
書き換えるツールを作成したのですが、



どのような書き換えをしているのでしょうか? もし、テキストや属性値に CR + LF を追加しているなら、この「
」という結果になるのは正常です。




メソッドの引数に変換を行いたい属性名とその属性値を指定して、
各ノードに対して、その属性名が見つかるまで検索し、
見つかれば、引数で与えた属性値で、上書きすると言う処理です。

確かに、テキストや属性値に改行コード( CR + LF)が入っています。


<a bbb=1234
5678>

のような感じです。(XMLファイル)


それを、Saveメソッドで保存した後、XMLファイルをのぞいて見ると、

<a bbb=1234&#xD;&#xA;5678>

のようになっているのです。

これは、XmlDocumentクラスまたは、DOM(?)の仕様(正常)なのでしょうか?
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2006-04-28 14:43
> これは、XmlDocumentクラスまたは、DOM(?)の仕様(正常)なのでしょうか?

はい、正常な動作です。その保存後のXML文書をもう一度ロードしてプログラム中からbbbの属性値を取ると、正しく「1234 CR LF 5678」になります。

XML文書上での改行は CR LF だろうが CR だろうが DOM 上では必ず LF のみになるので、CR LF を正しく保存するために文字参照「&#xD;&#xA;」になるんでしょう。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 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 ]
るぷ犬
常連さん
会議室デビュー日: 2004/11/10
投稿数: 46
投稿日時: 2006-04-28 15:53
引用:

スフレさんの書き込み (2006-04-28 14:43) より:
> これは、XmlDocumentクラスまたは、DOM(?)の仕様(正常)なのでしょうか?

はい、正常な動作です。その保存後のXML文書をもう一度ロードしてプログラム中からbbbの属性値を取ると、正しく「1234 CR LF 5678」になります。

XML文書上での改行は CR LF だろうが CR だろうが DOM 上では必ず LF のみになるので、CR LF を正しく保存するために文字参照「&#xD;&#xA;」になるんでしょう。




なるほど。<正常

であれば、一度書き換えられてしまった、XMLファイルをCR+LFに
戻したいのであれば、XMLファイルをテキストファイルとして読み込み、
「&#xD;&#xA;」を
「CR+LF」に
置換をして、再度、保存するなどをしないといけないのでしょうか?
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2006-04-28 17:25
引用:

であれば、一度書き換えられてしまった、XMLファイルをCR+LFに
戻したいのであれば、XMLファイルをテキストファイルとして読み込み、
「&#xD;&#xA;」を
「CR+LF」に
置換をして、再度、保存するなどをしないといけないのでしょうか?



いいえ。それをやると、次にパーズしたときに得られる値が「1234 LF 5678」になります。(MMXさんが挙げられた「属性値の正規化」)

値として欲しいのが「1234 CR LF 5678」で正しいのなら、「&#xD;&#xA;」のままで正しいです。XML文書として見たときにどのような表現になってるかを気にする必要はありません。
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-04-28 17:38
MMXさんが挙げられたリンクには
引用:

■属性値は正規化しなければならない
・・・
属性値の正規化は任意ではなく、必ず行わねばならないものである。


と書かれています。
なので、るぷ犬さんが作成したツールではなく、
XMLを正しく処理できていないシステム側に問題があるのではないでしょうか?

不具合のあるシステムで不具合が表面化しないように、ツール側が不正なXMLを生成する。
というのは何か違う気がします。

とりあえず、言えるだけ言ってみては?
それでもダメだったら、るぷ太さんの仰るとおり変換するしかないでしょう。
るぷ犬
常連さん
会議室デビュー日: 2004/11/10
投稿数: 46
投稿日時: 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の仕様(?)なら、
いいのですが…。(仕様なら言い切れるので。)
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 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 ]

スキルアップ/キャリアアップ(JOB@IT)