到目前为止,我正在做的是:
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>
事情是 - 我不一定知道它是否总是在同一个地方。
答案 0 :(得分:4)
一种方法可能是在解析之前验证一些事情。您可以使用正则表达式来验证XML标记,但更简单的可能是Stack
,您可以在其中添加每个<
和>
符号。之后只是循环通过它并声明你没有连续两次获得相同的符号。
这提出了一个问题:您如何区分<MyElement>>
和<MyEl>ement>
?
但这一切都很模糊:当XML证明无效时,你想要发生什么?您希望在多大程度上进行此预处理验证?
我认为这里最好的选择是不要继续。您无法修复因格式错误的XML而引发的每个问题,最好通知用户并将其结束。
如果来源一直向您发送格式错误的XML,您必须联系维护人员或寻找替代方案。
答案 1 :(得分:1)
正如其他人所说 - 这里有几件事要做:
步骤1 - 确定XML是否格式错误。对于元素和值(或属性) 解决方案:使用正则表达式或通过String Builder加载并解析/查找字符(正则表达式总是更好)
步骤2:如果要验证某些元素是否始终(最低限度),您也可以形成XSD。基于工作流程 - 如果那些不显示 - 您可以抛出错误 - 取决于您的工作流程
步骤3:解析/修复XML后,您需要使用这些值 解决方案:LINQ to XML实际上是一种很好的方法,可以为您感兴趣的内容提取值,而不是格式错误