c# - 应该如何在 XML 属性值中处理 '\t' 字符?

标签 c# .net xml

我似乎发现了 .Net 3.5 中各种 XML 实现之间的一些不一致,我正在努力找出名义上正确的东西。

这个问题实际上很容易重现:

  1. 使用包含“\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' 字符非常满意。

  2. 使用新的 XmlTextReader 加载文档:

    var rawFile = XmlReader.Create(@"D:\TabTest.xml");
    var rawDoc = new XmlDocument();
    rawDoc.Load(rawFile);
    
  3. 使用 XmlReader.Create 加载文档:

    var rawFile2 = new XmlTextReader(@"D:\TabTest.xml");
    var rawDoc2 = new XmlDocument();
    rawDoc2.Load(rawFile2);
    
  4. 比较调试器中的文档:

    (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/

相关文章:

c# - 为什么具有泛型类型的基本 Windows 窗体窗体类会停止设计器加载?

c# - 何时实现 iNotifyPropertyChanged 接口(interface)?

python - 使用 Python 将 XML 文档插入现有 XML

c# - LINQ 到 SQL : Alter Table or Add New Table to Existing Database

c# - 在 Azure 中使用 Identity Server 签名证书

c# - 为什么通用类型定义实现的接口(interface)会丢失类型信息?

java - 将 Java 文件添加到 Android 应用程序

php - 将 XML 文件元素转换为 PHP 数组

c# - DateTime.TryParse() 在具有显式区域性的不同计算机上返回不同的结果

c# - 选择什么 .NET 版本以避免安装另一个框架?