【问题标题】:Strip < Character from XML content从 XML 内容中去除 < 字符
【发布时间】:2013-03-30 07:22:49
【问题描述】:

我有一个 XML 文档,其中包含带有 &lt; 字符的数据。

<Tunings>
    <Notes>Norm <150 mg/dl</Notes>
</Tunings>

我使用的代码是:

StreamReader objReader = new StreamReader(strFile);
string strData = objReader.ReadToEnd();

XmlDocument doc = new XmlDocument();

// Here I want to strip those characters from "strData"

doc.LoadXml(strData);

所以它给出了错误:

名称不能以“1”字符开头,十六进制值 0x31。

那么有没有办法在 Load 调用之前从 XML 中去除这些字符?

【问题讨论】:

  • 您是否有权访问创建 XML 文件的代码?
  • “我有一个 XML 文档”——不,你没有。 &lt;150 不是有效的 XML 标记。不要修复阅读器,而是检查您是否可以修复文件的生成器。否则,您将很难为这种类似 XML 但不完全的文件格式实现自己的解析器。
  • 是的..我可以在创建时修复它,但现在我希望导入文件,即使它包含那些无效字符。
  • XmlException 为您提供错误的行号和位置。您可以检查异常是否是“名称不能以 X 字符开头”错误,如果是,请记住位置,使用文本阅读器打开文件,替换无效字符,然后尝试再次将其加载到 XmlDocument 中。
  • @VishalSuthar - “我可以在创建时修复它,但现在我希望导入文件,即使它包含那些无效字符。”如果您可以控制 XML 的输出(创建),我认为专注于这一点会好得多,而不是在解析它时尝试处理无效的 XML。如果您绝对需要在其中包含 &lt;,则将该元素的内容包装在 CDATA 标记中 XML 解析器不会阻塞它。

标签: c# xml regex


【解决方案1】:

如果这仅发生在 &lt;Notes&gt; 部分,我建议您修改 XML 文件的创建以使用 CDATA 标记来包含 Notes 中的文本,如下所示:

<Notes><![CDATA[Norm <150 mg/dl]]></Notes>

CDATA 标记告诉 XML 解析器不要解析 &lt;![CDATA[]]&gt; 之间的字符。这允许您在 XML 中包含可能会破坏解析的字符。

您可以将 CDATA 标记用于您知道(或有合理预期)该数据中的特殊字符的任何情况。

尝试在解析时处理特殊字符(没有 CDATA)将比首先简单地修复 XML 的创建更费力(并且令人沮丧),IMO。另外,“Norm 不与“Norm 150 mg/dl”是一回事,对于需要该信息的人来说,这种区别可能很重要。

【讨论】:

    【解决方案2】:

    正如 cmets 所述,您没有 XML 文档。如果您知道这些文档偏离合法 XML 的唯一方式是在您的示例中,您可以通过正则表达式运行文件并将&lt;(?:\d) 替换为&amp;amp;。这将找到与数字相邻的&lt; 并对其进行正确编码。

    【讨论】:

      猜你喜欢
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多