我似乎在.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");
Run Code Online (Sandbox Code Playgroud)
注意:这意味着XmlDocument本身对属性值中的'\ t'字符非常满意.
使用新的XmlTextReader加载文档:
var rawFile = XmlReader.Create(@"D:\TabTest.xml");
var rawDoc = new XmlDocument();
rawDoc.Load(rawFile);
Run Code Online (Sandbox Code Playgroud)使用XmlReader.Create加载文档:
var rawFile2 = new XmlTextReader(@"D:\TabTest.xml");
var rawDoc2 = new XmlDocument();
rawDoc2.Load(rawFile2);
Run Code Online (Sandbox Code Playgroud)比较调试器中的文档:
(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
Run Code Online (Sandbox Code Playgroud)使用新的XmlTextReader读取的文档是我所期望的,文本值和属性值中的'\ t'都符合预期.但是,如果查看XmlReader.Create读取的文档,您会发现属性值中的'\ t'字符已转换为' '字符.
什么...... !! :-)
经过一段时间的Google搜索,我发现我可以将'\ t'编码为' ' - 如果我在示例XML中使用此而不是'\ t',则两个阅读器都按预期工作.
现在Altova XmlSpy和其他各种XML阅读器似乎对属性值中的'\ t'字符非常满意,我的问题是处理这个问题的正确方法是什么?
我应该编写带有'\ t'字符的XML文件,这些字符在XmlReader.Create等属性值中编码,或者是其他XML工具是否正确,'\ t'字符是否有效且XmlReader.Create是否已损坏?
我应该以哪种方式解决此问题?
@all:感谢您的所有回答和评论。
Justin 和 Michael Kay 似乎是正确的,空白应该根据 W3C XML 规范进行编码,但问题是大量 MS 实现不满足此要求。
就我而言,除了 XML 规范之外,我真正想要的是正确保留属性值 - 即保存的值应该与读取的值完全相同。
解决办法是在保存 XML 文件时强制使用通过 XmlWriter.Create 方法创建的 XmlWriter。
虽然 Dataset 和 XmlDocument 都提供保存/写入机制,但在以其默认形式使用时,它们都不能正确编码属性中的空格。但是,如果我强制他们使用手动创建的 XmlWriter,则会应用正确的编码并将其写入文件。
所以原来的文件保存代码就变成了:
var xmlDoc = new XmlDocument { PreserveWhitespace = false, };
xmlDoc.LoadXml("<test><text attrib=\"Tab'\t'space' '\">Tab'\t'space' '</text></test>");
using (var xmlWriter = XmlWriter.Create(@"d:\TabTest.Encoded.xml"))
{
xmlDoc.Save(xmlWriter);
}
Run Code Online (Sandbox Code Playgroud)
然后,该编写器以对称方式正确编码空白,以便 XmlReader.Create 读取器在不更改属性值的情况下进行读取。
这里要注意的另一件事是,该解决方案完全封装了我的代码中的编码,因为读取器和写入器在读取和写入时透明地执行编码和解码。
| 归档时间: |
|
| 查看次数: |
5918 次 |
| 最近记录: |