【问题标题】:XmlDocument dropping encoded charactersXmlDocument 删除编码字符
【发布时间】:2009-01-19 17:41:45
【问题描述】:

我的 C# 应用程序使用以下代码加载 XML 文档:

XmlDocument doc = new XmlDocument();
doc.Load(path);

其中一些文档包含编码字符,例如:

<xsl:text>&#10;</xsl:text>

我注意到当这些文档被加载时,&amp;#10; 被删除了。

我的问题:我怎样才能保留&lt;xsl:text&gt;&amp;#10;&lt;/xsl:text&gt;

仅供参考 - 用于这些文档的 XML 声明:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

【问题讨论】:

  • Ping:我更新了我现有的答案,所以我添加了一个快速评论,以确保您的“回复”选项卡上显示一些内容。

标签: c# xml encoding


【解决方案1】:

你确定角色被删除了吗?字符 10 只是一个换行符 - 它不会完全显示在您的调试器窗口中。它也可以被视为空白。您是否尝试过使用 xmldocument 上的空白设置?


如果您需要保留编码,您只有两个选择:一个 CDATA 部分或作为纯文本而不是 Xml 读取。我怀疑您对进入系统的文档的控制权绝对为 0,因此消除了 CDATA 选项。

纯文本而不是 Xml 也可能令人反感,但它就是你所剩下的。如果您需要进行验证或其他处理,您可以首先加载并验证 xml,然后使用简单文件流作为单独的步骤连接您的文件。再说一遍:不理想,但仅此而已。

【讨论】:

  • 使用 PreserveWhitespace = true; 我在调试窗口(内部 xml)中以及文件被保存但未编码时看到它。我的应用是中介;它将许多较小的 xml 文档组合成一个较大的文档,因此我需要保留编码形式。
  • 如果没有业务需求要求在构建较大的 xml 时对较小的 xml 进行修改,我会将它们全部附加在一起。
  • 我不明白为什么需要保留编码形式 - 每个 XML 解析器都应该将两者视为相同。你能更详细地解释一下这个要求吗?
  • 乔尔——正确。我无法控制输入文件。我倾向于使用文件流和正则表达式来实现我需要做的事情。
  • Jon – 我的应用程序的目的是自动化前端团队(XSLT 的创建者)完成的手动过程。我将文件作为输入并生成文件作为输出。
【解决方案2】:

&amp;#10; 是换行符 - 即空格。 XML 解析器会将其作为换行符加载,然后忽略它最初被编码的事实。编码只是将数据序列化为文本格式的一部分 - 它不是数据本身的一部分。

现在,XML 有时会忽略空格,有时则不会,具体取决于上下文、API 等。正如 Joel 所说,您可能会发现它根本没有丢失 - 或者您可能会发现将它与允许您保留的 API 一起使用空格解决了这个问题。当您输出数据时,如果看到它变成未编码的换行符,我不会完全感到惊讶。

【讨论】:

  • 是的 - 一旦输出数据,它确实是一个未编码的换行符 - 不幸的是我需要保留编码的形式。
  • does doc.PreserveWhitespace = True;帮忙?
  • 不,不会。符合标准的 XML 处理器可能无法区分换行符和元素内容中对代码 10 的字符引用,句号。 (属性值不同。)为什么要保留编码形式?
  • bobince - 请参阅 Joel Coehoorn 答案中的 cmets 部分
【解决方案3】:

也许将数据保存在 ![CDATA] 中会更好?

http://www.w3schools.com/XML/xml_cdata.asp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2011-12-04
    • 2010-12-12
    • 2014-07-16
    • 2020-02-17
    相关资源
    最近更新 更多