簡體   English   中英

在 C# 上針對 XSD 驗證 XML 電子發票

[英]Validating XML electronic invoice against XSD on C#

我正在為意大利電子發票創建一個 xml,這是模型:

public class EInvoice
    {
        public class Fattura
        {
            [Serializable]
            [XmlType(Namespace = "https://www.fatturapa.gov.it/export/documenti/fatturapa/v1.2.1/Schema_del_file_xml_FatturaPA_versione_1.2.1.xsd")]
            [XmlRoot("FatturaElettronica", Namespace = "https://www.fatturapa.gov.it/export/documenti/fatturapa/v1.2.1/Schema_del_file_xml_FatturaPA_versione_1.2.1.xsd", IsNullable = false)]
            public class FatturaElettronicaType
            {
                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public FatturaElettronicaHeaderType FatturaElettronicaHeader { get; set; }
                [XmlElement("FatturaElettronicaBody", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public List<FatturaElettronicaBodyType> FatturaElettronicaBody { get; set; }

                // <XmlElement([Namespace]:="http://www.w3.org/2000/09/xmldsig#")>
                // Public Property Signature As SignatureType

                [XmlAttribute]
                public FormatoTrasmissioneType versione { get; set; }
            }


            [Serializable]
            [XmlType(Namespace = "https://www.fatturapa.gov.it/export/documenti/fatturapa/v1.2.1/Schema_del_file_xml_FatturaPA_versione_1.2.1.xsd")]
            public class FatturaElettronicaHeaderType
            {
                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public DatiTrasmissioneType DatiTrasmissione { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public CedentePrestatoreType CedentePrestatore { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public RappresentanteFiscaleType RappresentanteFiscale { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public CessionarioCommittenteType CessionarioCommittente { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public TerzoIntermediarioSoggettoEmittenteType TerzoIntermediarioOSoggettoEmittente { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public SoggettoEmittenteType SoggettoEmittente { get; set; }

                [XmlIgnore]
                public bool SoggettoEmittenteSpecified { get; set; }
            }

            [Serializable]
            [XmlType(Namespace = "https://www.fatturapa.gov.it/export/documenti/fatturapa/v1.2.1/Schema_del_file_xml_FatturaPA_versione_1.2.1.xsd")]
            public class DatiTrasmissioneType
            {
                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public IdFiscaleType IdTrasmittente { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, DataType = "normalizedString")]
                public string ProgressivoInvio { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public FormatoTrasmissioneType FormatoTrasmissione { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public string CodiceDestinatario { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public ContattiTrasmittenteType ContattiTrasmittente { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public string PECDestinatario { get; set; }
            }


            [Serializable]
            [XmlType(Namespace = "https://www.fatturapa.gov.it/export/documenti/fatturapa/v1.2.1/Schema_del_file_xml_FatturaPA_versione_1.2.1.xsd")]
            public class IdFiscaleType
            {
                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public string IdPaese { get; set; }

                [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
                public string IdCodice { get; set; }
            }


            ................................


        }
    }

生成的xml是這樣的:

<?xml version="1.0" encoding="utf-8"?>
<FatturaElettronica xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" versione="FPR12" xmlns="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2">
  <FatturaElettronicaHeader xmlns="">
    <DatiTrasmissione>
      <IdTrasmittente>
        <IdPaese>IT</IdPaese>
        <IdCodice>06348743213</IdCodice>
      </IdTrasmittente>
      <ProgressivoInvio>1</ProgressivoInvio>
      <FormatoTrasmissione>FPR12</FormatoTrasmissione>
      <CodiceDestinatario>X2PH45J</CodiceDestinatario>
    </DatiTrasmissione>
    <CedentePrestatore>
      <DatiAnagrafici>
        <IdFiscaleIVA>
          <IdPaese>IT</IdPaese>
          <IdCodice>06348743213</IdCodice>
        </IdFiscaleIVA>
        <CodiceFiscale>06348743213</CodiceFiscale>
        <Anagrafica>
          <Denominazione>MyCompany</Denominazione>
        </Anagrafica>
        <RegimeFiscale>RF01</RegimeFiscale>
      </DatiAnagrafici>
      <Sede>
        <Indirizzo>via Milano 26</Indirizzo>
        <CAP>10126</CAP>
        <Comune>Milano</Comune>
        <Provincia>MI</Provincia>
        <Nazione>IT</Nazione>
      </Sede>
    </CedentePrestatore>
    <CessionarioCommittente>
      <DatiAnagrafici>
        <IdFiscaleIVA>
          <IdPaese>IT</IdPaese>
          <IdCodice>05841012217</IdCodice>
        </IdFiscaleIVA>
        <CodiceFiscale>05841012217</CodiceFiscale>
        <Anagrafica>
          <Denominazione>CompanyDenomination</Denominazione>
        </Anagrafica>
      </DatiAnagrafici>
      <Sede>
        <Indirizzo>Wall Street</Indirizzo>
        <NumeroCivico>10</NumeroCivico>
        <CAP>10095</CAP>
        <Comune>New York</Comune>
        <Provincia>NY</Provincia>
        <Nazione>USA</Nazione>
      </Sede>
    </CessionarioCommittente>
  </FatturaElettronicaHeader>
  <FatturaElettronicaBody xmlns="">
    <DatiGenerali>
      <DatiGeneraliDocumento>
        <TipoDocumento>TD01</TipoDocumento>
        <Divisa>EUR</Divisa>
        <Data>2020-11-13</Data>
        <Numero>260/IT</Numero>
        <ImportoTotaleDocumento>2000.00</ImportoTotaleDocumento>
      </DatiGeneraliDocumento>
    </DatiGenerali>
    <DatiBeniServizi>
      <DettaglioLinee>
        <NumeroLinea>1</NumeroLinea>
        <Descrizione>Consulenza</Descrizione>
        <PrezzoUnitario>2000.00</PrezzoUnitario>
        <PrezzoTotale>2000.00</PrezzoTotale>
        <AliquotaIVA>22.00</AliquotaIVA>
        <RiferimentoAmministrazione>4309882</RiferimentoAmministrazione>
      </DettaglioLinee>
      <DatiRiepilogo>
        <AliquotaIVA>22.00</AliquotaIVA>
        <ImponibileImporto>2000.00</ImponibileImporto>
        <Imposta>440.00</Imposta>
      </DatiRiepilogo>
    </DatiBeniServizi>
    <DatiPagamento>
      <CondizioniPagamento>TP02</CondizioniPagamento>
      <DettaglioPagamento>
        <ModalitaPagamento>MP05</ModalitaPagamento>
        <DataScadenzaPagamento>2021-01-31</DataScadenzaPagamento>
        <ImportoPagamento>2000.00</ImportoPagamento>
      </DettaglioPagamento>
    </DatiPagamento>
  </FatturaElettronicaBody>
</FatturaElettronica>

最后,我嘗試以這種方式驗證 xml:

        private static void Main(){
            ........
            // Set the validation settings.
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
            settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
            settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
            settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

            // Create the XmlReader object.
            XmlReader reader = XmlReader.Create($"c:\\log\\{filname.xml}", settings);

            // Parse the file. 
            while (reader.Read()) ;

        }
        // Display any warnings or errors.
        private static void ValidationCallBack(object sender, ValidationEventArgs args)
        {
            if (args.Severity == XmlSeverityType.Warning)
                Console.WriteLine("\tWarning: Matching schema not found.  No validation occurred." + args.Message);
            else
                Console.WriteLine("\tValidation error: " + args.Message);

        }

但是驗證失敗並顯示此消息:

找不到元素“https://www.fatturapa.gov.it/export/documenti/fatturapa/v1.2.1/Schema_del_file_xml_FatturaPA_versione_1.2.1.xsd:FatturaElettronica”的架構信息。

為什么如果標簽FatturaElettronica是我的 .xml 的第一個元素?

您的 XML 有一個默認命名空間。 應該考慮到這一點。

請嘗試在您的代碼中添加幾行:

C#

...

settings.Schemas.Add(null, new XmlTextReader(_schemaName)); // more efficient way to handle namespaces
settings.Schemas.Compile();

問題是 xsd: https://www.fatturapa.gov.it/export/documenti/fatturapa/v1.2.1/Schema_del_file_xml_FatturaPA_versione_1.2.1.xsd不正確。

如果你想在線驗證它會顯示幾個錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM