.Net 3.5 内のさまざまな XML 実装の間に矛盾があることを発見したようで、名目上正しいものを見つけるのに苦労しています。
この問題は、実際にはかなり簡単に再現できます。
「\t」文字を含むテキスト要素を持つ単純な xml ドキュメントを作成し、「\t」文字を含む属性を指定します。
var xmlDoc = new XmlDocument { PreserveWhitespace = false, }; xmlDoc.LoadXml("<test><text attrib=\"Tab'\t'space' '\">Tab'\t'space' '</text></test>"); xmlDoc.Save(@"d:\TabTest.xml");
注意: これは、XmlDocument 自体が属性値の '\t' 文字に非常に満足していることを意味します。
新しい XmlTextReader を使用してドキュメントを読み込みます。
var rawFile = XmlReader.Create(@"D:\TabTest.xml"); var rawDoc = new XmlDocument(); rawDoc.Load(rawFile);
XmlReader.Create を使用してドキュメントを読み込みます。
var rawFile2 = new XmlTextReader(@"D:\TabTest.xml"); var rawDoc2 = new XmlDocument(); rawDoc2.Load(rawFile2);
デバッガーでドキュメントを比較します。
(rawDoc).InnerXml "<test><text attrib=\"Tab' 'space' '\">Tab'\t'space' '</text></test>" string (rawDoc2).InnerXml "<test><text attrib=\"Tab'\t'space' '\">Tab'\t'space' '</text></test>" string
新しい XmlTextReader を使用して読み取られたドキュメントは、期待どおりでした。テキスト値と属性値の両方に「\t」がありました。しかし、XmlReader.Create で読み取ったドキュメントを見ると、属性値の「\t」文字が文字に変換されていることがわかります' '
。
なんと……!! :-)
ちょっとした Google 検索の結果、'\t' を ' ' としてエンコードできることがわかりました。- XML の例で '\t' の代わりにこれを使用すると、両方のリーダーが期待どおりに動作します。
現在、Altova XmlSpy およびその他のさまざまな XML リーダーは、属性値の '\t' 文字に完全に満足しているようです。私の質問は、これを処理する正しい方法は何ですか?
XmlReader.Create のような属性値でエンコードされた '\t' 文字を使用して XML ファイルを作成する必要がありますか、それとも他の XML ツールが正しく、'\t' 文字は有効であり、XmlReader.Create は壊れていますか?
この問題を修正/回避するには、どの方法を使用すればよいですか?