我似乎发现了 .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 已损坏?
我应该用什么方法来解决/解决这个问题?
最佳答案
可能与属性值规范化有关。对于 CDATA 属性,XML 解析器需要用空格替换属性值中的换行符和制表符,除非它们以转义形式编写为字符引用。
关于c# - 应该如何在 XML 属性值中处理 '\t' 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12260524/