2015-09-16 135 views
0

我有以下Xml,我想根據Xsd Schema進行驗證(以下)。 我想使用下面給出的C#函數來針對給定的Xsd Schema驗證Xml。我收到這種通用類錯誤消息「根級數據無效,第1行,第1位」。這發生在「while(vr.Read())」。驗證Xml針對Xsd Schema的錯誤

你能解釋一下這個問題的原因和解決方法是什麼,或者有什麼辦法可以解決這些類型的通用錯誤。

正如您從我的Xsd模式可以看到的,它也具有對其他子xsd文件的引用。我想知道它是否與錯誤有關。

親切問候

XML文件

<?xml version="1.0" encoding="utf-8"?> 
<n1:Form109495CTransmittalUpstream xmlns="urn:us:gov:treasury:irs:ext:aca:air:6.2" xmlns:irs="urn:us:gov:treasury:irs:common" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:n1="urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage" xsi:schemaLocation="urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage IRS-Form1094-1095CTransmitterUpstreamMessage.xsd"> 
<Form1094CUpstreamDetail recordType="C" lineNum="0"> 
    <--MORE XML TAGS HERE --> 
    </Form1094CUpstreamDetail> 
</n1:Form109495CTransmittalUpstream> 

XSD架構

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns="urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:irs="urn:us:gov:treasury:irs:common" 
xmlns:air6.2="urn:us:gov:treasury:irs:ext:aca:air:6.2" 
targetNamespace="urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage" 
elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0"> 
<xsd:annotation> 
    <xsd:appinfo> 
     <release>ACA Release 6.2</release> 
    </xsd:appinfo> 
    <xsd:documentation>Form-1094C (Issuer) Transmittal and Form 1095C - Transmittal of Health Insurance Coverage Statements 
     <VersionNum>5.2</VersionNum> 
     <VersionEffectiveBeginDt>2015-01-06</VersionEffectiveBeginDt> 
    </xsd:documentation> 
</xsd:annotation> 
<!-- ===== Imports ===== --> 
<xsd:import namespace="urn:us:gov:treasury:irs:common" schemaLocation="common-IRS-CAC.xsd"/> 
<xsd:import namespace="urn:us:gov:treasury:irs:ext:aca:air:6.2" 
    schemaLocation="ext-IRS-EXT-ACA-AIR-6.2.xsd"/> 
<xsd:element name="Form109495CTransmittalUpstream" type="Form109495CTransmittalUpstreamType"> 
    <xsd:annotation> 
     <xsd:documentation> 
      <Component> 
       <DictionaryEntryNm>Form109495C Transmission Upstream</DictionaryEntryNm> 
       <MajorVersionNum>1</MajorVersionNum> 
       <MinorVersionNum>1</MinorVersionNum> 
       <VersionEffectiveBeginDt>2015-01-06</VersionEffectiveBeginDt> 
       <VersionDescriptionTxt>Initial Version</VersionDescriptionTxt> 
       <DescriptionTxt>The elements associated with 1094C data generated EOY report</DescriptionTxt> 
      </Component> 
     </xsd:documentation> 
    </xsd:annotation> 
</xsd:element> 
<xsd:complexType name="Form109495CTransmittalUpstreamType"> 
    <xsd:annotation> 
     <xsd:documentation> 
      <Component> 
       <DictionaryEntryNm>Form109495C Transmission Upstream Type</DictionaryEntryNm> 
       <MajorVersionNum>1</MajorVersionNum> 
       <MinorVersionNum>1</MinorVersionNum> 
       <VersionEffectiveBeginDt>2014-11-05</VersionEffectiveBeginDt> 
       <VersionDescriptionTxt>Initial Version</VersionDescriptionTxt> 
       <DescriptionTxt>Transmission type for 1094C forms upstream data generated EOY report</DescriptionTxt> 
      </Component> 
     </xsd:documentation> 
    </xsd:annotation> 
    <xsd:sequence> 
     <xsd:element ref="air6.2:Form1094CUpstreamDetail" minOccurs="1" maxOccurs="unbounded"/> 
    </xsd:sequence> 
</xsd:complexType> 
</xsd:schema> 

以下是C#驗證功能:

/// <SUMMARY> 
    /// This method validates an xml string against an xml schema. 
    /// </SUMMARY> 
    /// <PARAM name="xml">StringReader containing xml</PARAM> 
    /// <PARAM name="schemaNamespace">XML Schema Namespace</PARAM> 
    /// <PARAM name="schemaUri">XML Schema Uri</PARAM> 
    /// <RETURNS>bool</RETURNS> 
    public bool ValidXmlDoc(StringReader xml, 
      string schemaNamespace, string schemaUri) 
    { 
     // Continue? 
     if(xml == null || schemaNamespace == null || schemaUri == null) 
     { 
      return false; 
     } 

     isValidXml = true; 
     XmlValidatingReader vr; 
     XmlTextReader tr; 
     XmlSchemaCollection schemaCol = new XmlSchemaCollection(); 
     schemaCol.Add(schemaNamespace, schemaUri); 

     try 
     { 
      // Read the xml. 
      tr = new XmlTextReader(xml); 
      // Create the validator. 
      vr = new XmlValidatingReader(tr); 
      // Set the validation tyep. 
      vr.ValidationType = ValidationType.Schema; 
      // Add the schema. 
      if(schemaCol != null) 
      { 
       vr.Schemas.Add(schemaCol); 
      } 
      // Set the validation event handler. 
      vr.ValidationEventHandler += 
       new ValidationEventHandler(ValidationCallBack); 
      // Read the xml schema. 
      while(vr.Read()) 
      { 
      } 

      vr.Close(); 

      return isValidXml; 
     } 
     catch(Exception ex) 
     { 
      this.ValidationError = ex.Message; 
      return false; 
     } 
     finally 
     { 
      // Clean up... 
      vr = null; 
      tr = null; 
     } 
    } 

回答

1

AFAIK XmlValidatingReader已過時。我想你會更好地使用XmlReader。爲了控制URI解決方案(如果模式引用了其他方案作爲相對路徑),您可以通過從XmlUrlResolver繼承並重寫ResolveUri方法來創建自己的XML URL解析器類。然後將其分配給XmlReaderSettings類的XmlResolver成員。不過,我希望事情不會惡化,但希望:)這裏是我可以建議的原理圖代碼:

  XmlTextReader reader = new XmlTextReader(pathToXSD); 
      XmlSchema schema = XmlSchema.Read(reader,  ValidationEventHandler); 
      XmlReaderSettings settings = new XmlReaderSettings(); 

      settings.ValidationType = ValidationType.Schema; 
      settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; 
      settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; 
      settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
      settings.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler); 
      settings.Schemas.Add(schema); 

      using (StringReader xmlStream = new StringReader(xml)) 
      { 
       using (XmlReader xmlReader = XmlReader.Create(xmlStream, settings)) 
       { 
        while (xmlReader.Read()) { } 
       } 
      }