【问题标题】:How would I parse an entire XML file that is possibly malformed?我将如何解析可能格式错误的整个 XML 文件?
【发布时间】:2013-10-10 20:33:32
【问题描述】:

到目前为止,我正在做的是:

try 
{
    XmlDocument xmldoc = loadXml(orderFilePath);
}
catch (XmlException exception)
{
    //... blah blah - there was an error, let the user know
}

但我真的很希望能够尝试解析文件。当我说“格式错误”时,我并不一定意味着会有一个未封闭的标签或元素,而是元素的值中可能包含以下内容之一:''、'&'

我已经看到有人提到我可能必须使用 XmlReader - 但是这仍然会在该元素上引发异常,还是允许我以某种方式解决问题?

我知道从源头修复 XML 是最好的解决方案,但我无法控制 XML 的来源。

谢谢!

编辑:

XML 的超级简单示例:

<Order>
  <Customer_ID>555-555-5555</Customer_ID>
  <ShipToAddress>
    <Customer_Name>Some Guy</Customer_Name>
    <Street>123 Fake Dr.</Street>
    <Street2></Street2>
    <City>West Palm Beach</City>
    <State>FL</State>
    <ZipCode>33417</ZipCode>
    <Country>United States</Country>
  </ShipToAddress>
  <BillToAddress>
    <Customer_Name>Some Guy</Customer_Name>
    <Street>123 Fake Dr.</Street>
    <Street2></Street2>
    <City>West Palm Beach</City>
    <State>FL</State>
    <ZipCode>33417</ZipCode>
    <Country>United States</Country>
  </BillToAddress>
  <items>
    <item>
      <Product_ID>25101</Product_ID>
      <Product_Name></Product_Name>
      <Quantity>1</Quantity>
      <USPrice>26.95000</USPrice>
    </item>
  </items>
<!-- bad stuff here -->
<How_did_you_hear_about_us>Coffee & Tea magazine</How_did_you_hear_about_us>
<!-- bad stuff here -->
</Order>

问题是 - 我不一定知道它是否会一直在同一个地方。

【问题讨论】:

  • 给出格式错误的 XML 的更清晰示例。
  • 您可能需要先读取文件并使用正则表达式将未转义字符匹配并替换为转义版本,然后将文档重新读取为 XML。您必须确定哪些可能是畸形的以及如何修复它才能制作您的表达。也许你可以假设 XML 标记总是格式正确的,因此用它们的转义版本替换任何杂散括号,这些版本被假定为被读取为文本
  • 格式错误的 XML 不是 XML。您应该将其视为文本文件并适当阅读...也许某些 HTML 解析器会起作用(即我会尝试 HtmlAgilityPack)。
  • 我现在明白了。您绝对可以使用一些正则表达式来查看 &gt;&lt; 之间的内容,并将 &amp; 替换为其他内容。
  • @Zaemz 我知道这不是 C#,但请查看 this question。它看起来几乎与您遇到的问题完全相同。其中一个答案也有您需要的正则表达式!

标签: c# xml exception malformed


【解决方案1】:

一种方法是在解析之前验证一些内容。您可以使用正则表达式来验证 XML 标记,但可能更容易的是 Stack 在其中添加每个 &lt;&gt; 符号。之后只需循环遍历它并断言您不会连续两次获得相同的符号。

这就提出了一个问题:您如何区分&lt;MyElement&gt;&gt;&lt;MyEl&gt;ement&gt;

这一切都非常模糊:当 XML 被证明无效时,您希望发生什么?您想进行多长时间的预处理验证?

我认为最好的选择是不继续。您无法解决向您抛出的格式错误的 XML 的所有问题,最好通知用户并结束它。

如果源一直向您发送格式错误的 XML,您必须联系维护人员或寻找替代方案。

【讨论】:

  • 谢谢你,杰罗恩。我同意你的看法。我将向负责 XML 的人员做一个说明。我只想到纠正节点值的问题。
【解决方案2】:

正如其他人所提到的 - 这里有几件事要做:

第 1 步 - 查明 XML 是否格式错误。对于元素和值(或属性) 解决方案:使用 Regex 或通过 String Builder 加载并解析/查找字符(Regex 总是更好)

第 2 步:如果您想验证某些元素是否总是出现(最低限度),您也可以形成一个 XSD。基于工作流程 - 如果那些没有出现 - 你可以抛出错误 - 取决于你的工作流程

第 3 步:解析/修复 XML 后,您需要使用这些值 解决方案:LINQ to XML 确实是一种很好的方法,可以提取您感兴趣的值而不是格式错误

【讨论】:

    猜你喜欢
    • 2019-01-21
    • 2011-05-23
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2010-10-29
    • 1970-01-01
    • 2012-05-20
    相关资源
    最近更新 更多