我似乎发现 .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
使用 new XmlTextReader 读取的文档是我所期望的,文本值和属性值中的 '\t' 都按预期存在。但是,如果您查看 XmlReader.Create 读取的文档,您会发现属性值中的 '\t' 字符将已转换为' '
字符。
什么……!!:-)
经过一番谷歌搜索后,我发现我可以将 '\t' 编码为 ' ' - 如果我在示例 XML 中使用它而不是 '\t' ,则两个阅读器都按预期工作。
现在 Altova XmlSpy 和其他各种 XML 阅读器似乎对属性值中的 '\t' 字符非常满意,我的问题是处理这个问题的正确方法是什么?
我是否应该使用以 XmlReader.Create 等属性值编码的 '\t' 字符编写 XML 文件,或者其他 XML 工具是否正确且 '\t' 字符有效且 XmlReader.Create 已损坏?
我应该以哪种方式修复/解决此问题?