我如何解析可能格式错误的整个XML文件?

时间:2013-10-10 20:33:32

标签: c# xml exception malformed

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

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>

事情是 - 我不一定知道它是否总是在同一个地方。

2 个答案:

答案 0 :(得分:4)

一种方法可能是在解析之前验证一些事情。您可以使用正则表达式来验证XML标记,但更简单的可能是Stack,您可以在其中添加每个<>符号。之后只是循环通过它并声明你没有连续两次获得相同的符号。

这提出了一个问题:您如何区分<MyElement>><MyEl>ement>

但这一切都很模糊:当XML证明无效时,你想要发生什么?您希望在多大程度上进行此预处理验证?

我认为这里最好的选择是不要继续。您无法修复因格式错误的XML而引发的每个问题,最好通知用户并将其结束。

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

答案 1 :(得分:1)

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

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

步骤2:如果要验证某些元素是否始终(最低限度),您也可以形成XSD。基于工作流程 - 如果那些不显示 - 您可以抛出错误 - 取决于您的工作流程

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