有没有办法忽略所有xml解析异常?

时间:2011-09-14 07:58:43

标签: c# xml

我必须解析用户文档,有时候它们格式不正确。它可能在标签或其他问题之前包含空格。我可以使它们形成良好的形式,或者如果这是不可能的,我怎么能忽略所有异常? 我也得到关于字节标记顺序的例外,因为文档是UTF-16编码但没有字节标记,我不能添加任何因为它们是用户文件。

好的,有人能告诉我这个样本数据有什么问题吗? (这是设备文档中的注释:此协议生成的所有交换都将使用符合XSD的XML文件执行 在本文档中描述。)

     <?xml version="1.0" encoding="UTF-16"?>
     <PROTOCOLE_HEMATO_BIOCODE InstrumentCode="2" InstrumentType="Diana 5 Evolution"   SerialNumber="Ns" Version="C4.06" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <PROTOCOL_DATA>
     <RESULT>
     <INFORMATION>
     <PATIENT DoB="2011-08-03" FirstName="ALI" Location="" MedicalDoctor="" Name="NAVIDI" PatientCommentary="" PID="" RefTable="1" SID="1059"/>
     </INFORMATION>
     <DATAS DateTimeAnalyse="2011-08-03T11:36:11Z" IdOpAnalyse="Service" UnitsSytem="US">
     <PARAMETER IDParametre="0" LowerRefLimit="4" Nom="WBC" Statut_Limits="48" Units="K/µL" UpperRefLimit="10" Value="4.6"/>
     <PARAMETER IDParametre="1" LowerRefLimit="20" Nom="Lym%" Statut_Limits="48" Units="%" UpperRefLimit="45" Value="37.8"/>
     <PARAMETER IDParametre="2" LowerRefLimit="2" Nom="Mon%" Statut_Limits="48" Units1111="%" UpperRefLimit="8" Value="6"/>
     <PARAMETER IDParametre="3" LowerRefLimit="40"Nom="Neu%" Statut_Limits="48" Units="%" UpperRefLimit="75" Value="51.8"/>
     <PARAMETER IDParametre="4" LowerRefLimit="0" Nom="Bas%" Statut_Limits="48" Units="%" UpperRefLimit="3" Value="0"/>
     <PARAMETER IDParametre="5" LowerRefLimit="1" Nom="Eos%" Statut_Limits="48" Units="%" UpperRefLimit="7" Value="4.4"/>
     <PARAMETER IDParametre="7" LowerRefLimit="1.5" Nom="Lym#" Statut_Limits="48" Units="K/µL" UpperRefLimit="4.5" Value="1.7"/>
     <PARAMETER IDParametre="8" Nom="Mon#" Statut_Limits="48" Units="K/µL" UpperRefLimit="0.8" Value="0.28"/>
     <PARAMETER IDParametre="9" LowerRefLimit="2" Nom="Neu#" Statut_Limits="48" Units="K/µL" UpperRefLimit="7.5" Value="2.4"/>
     <PARAMETER IDParametre="10" Nom="Bas#" Statut_Limits="48" Units="K/µL" UpperRefLimit="0.2" Value="0"/>
     <PARAMETER IDParametre="11" Nom="Eos#" Statut_Limits="48" Units="K/µL" UpperRefLimit="0.6" Value="0.2"/>
     <PARAMETER IDParametre="21" LowerRefLimit="4.5" Nom="RBC" Statut_Limits="48" Units="M/µL" UpperRefLimit="6.2" Value="5.11"/>
     <PARAMETER IDParametre="22" LowerRefLimit="12" Nom="Hb" Statut_Limits="48" Units="g/dL" UpperRefLimit="18" Value="16.2"/>
     <PARAMETER IDParametre="23" LowerRefLimit="35" Nom="Hct" Statut_Limits="48" Units="%" UpperRefLimit="54" Value="48.8"/>
     <PARAMETER IDParametre="24" LowerRefLimit="80" Nom="MCV" Statut_Limits="51" Units="fL" UpperRefLimit="95" Value="95.5"/>
     <PARAMETER IDParametre="25" LowerRefLimit="27" Nom="MCH" Statut_Limits="48" Units="pg" UpperRefLimit="32" Value="31.7"/>
     <PARAMETER IDParametre="26" LowerRefLimit="32" Nom="MCHC" Statut_Limits="48" Units="%" UpperRefLimit="36" Value="33.2"/>
     <PARAMETER IDParametre="27" LowerRefLimit="11" Nom="RDW-cv" Statut_Limits="48" Units="%" UpperRefLimit="15" Value="10.6"/>
     <PARAMETER IDParametre="28" Nom="RDW-sd" Statut_Limits="48" Units="fL" Value="33.9"/>
     <PARAMETER IDParametre="29" LowerRefLimit="150" Nom="Plt" Statut_Limits="48" Units="K/µL" UpperRefLimit="500" Value="200"/>
     <PARAMETER IDParametre="30" LowerRefLimit="6" Nom="MPV" Statut_Limits="48" Units="fL" UpperRefLimit="10" Value="7.3"/>
     <PARAMETER IDParametre="31" Nom="Pct" Statut_Limits="48" Units="%" Value="0.15"/>
     <PARAMETER IDParametre="32" Nom="PDW" Statut_Limits="48" Units="%" Value="8.4"/>
     <PARAMETER IDParametre="33" Nom="Lx" Statut_Limits="48" Units=" " Value="20"/>
     <PARAMETER IDParametre="34" Nom="Ly" Statut_Limits="48" Units=" " Value="16"/>
     <PARAMETER IDParametre="35" Nom="Nx" Statut_Limits="48" Units=" " Value="59"/>
     </DATAS>
     <TRACABILITE IDOpValidation="" ModeleAnalyseur="Diana 5 Evolution" SerialNumber="" VersionCalcul="C4.06" VersionPackage="V6.26">
     <REACTIF ExpirationDate="2014-07-31" Lot="562" Product="HEMATON-5    "/>
     <REACTIF ExpirationDate="2014-05-04" Lot="12452" Product="HEMACORE    "/>
     <REACTIF ExpirationDate="2013-07-03" Lot="73049" Product="HEMALYSE-5    "/>
     <FACTEUR_CALIBRATION FactorDate="2011-07-31" FactorValue="1" IDParametre="0" ParameterName="WBC"/>
     <FACTEUR_CALIBRATION FactorDate="2011-07-31" FactorValue="1" IDParametre="21" ParameterName="RBC"/>
     <FACTEUR_CALIBRATION FactorDate="2011-07-31" FactorValue="1" IDParametre="22" ParameterName="Hb"/>
     <FACTEUR_CALIBRATION FactorDate="2011-07-31" FactorValue="1" IDParametre="24" ParameterName="MCV"/>
     <FACTEUR_CALIBRATION FactorDate="2011-07-31" FactorValue="1" IDParametre="29" ParameterName="Plt"/>
     <FACTEUR_CALIBRATION FactorDate="2011-07-31" FactorValue="1" IDParametre="30" ParameterName="MPV"/>
     </TRACABILITE>
     <IMAGE DataSize="6676" ImageType="3">
     <IMAGE_DATA>AQAAA
     </IMAGE_DATA>
     </IMAGE>
     </RESULT>
     </PROTOCOL_DATA>
     </PROTOCOLE_HEMATO_BIOCODE>

3 个答案:

答案 0 :(得分:1)

您可以在XML清理程序,类或库中编写(或在Internet上查找)。基本上,您需要逐行清理XML(删除空格等),然后才能正确解析它。你现在所拥有的甚至可能都不能称为XML。

答案 1 :(得分:0)

您可以尝试使用SAX for .NET http://saxdotnet.sourceforge.net

它不是文档解析API,而是标记解析,因此它不应该在格式不正确的XML文档上抛出异常。但是你必须自己编写处理标签的所有逻辑。

答案 2 :(得分:0)

要明确:

  • 仅仅因为某些东西看起来像XML并不意味着 XML。如果您的文档不是格式良好的XML文档,那么它不是XML文档。来自the specification
  

数据对象是 XML文档,如果它是well-formed

  • 如果您的文档不是XML,则无法使用XML解析器解析它

如果只是编码问题,那么您可以在读取文件时指定编码:

using (StreamReader reader = new StreamReader("myfile.xml", Encoding.Unicode))
{
    XmlDocument doc = new XmlDocument();
    doc.Load(reader);
}

上面将使用小端字节顺序加载UTF-16格式的文件“myfile.xml”。