3

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

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>

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

4

2 回答 2

4

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

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

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

我相信这里最好的选择是不继续。您无法解决向您抛出的格式错误的 XML 的所有问题,最好通知用户并解决此问题。

如果源始终向您发送格式错误的 XML,您将不得不联系维护人员或寻找替代方案。

于 2013-10-10T20:41:07.097 回答
1

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

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

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

第 3 步:解析/修复 XML 后 - 然后需要使用值

于 2013-10-10T20:53:01.877 回答