Подстановочный знак ## любая ошибка проверки схемы XML - PullRequest
0 голосов
/ 24 октября 2018

Получение ошибки выше при проверке XSD по схеме в C #.Схема ищет перечисленные теги, а другие входящие теги необязательны.Ниже мой XSD-файл.Как необходимо изменить XML-файл, чтобы он удостоверился в том, что в XSD указаны перечисленные ниже теги, и игнорирует дополнительные теги. Он использует средство чтения текста XML для проверки схемы

enter image description here

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="InvoiceExport" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="InvoiceExport" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Invoice">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Invoice_ID" type="xs:string" minOccurs="1" />             
              <xs:element name="BillingEntity" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Name" type="xs:string" minOccurs="1" />                  
                    <xs:element name="VendorNumber" type="xs:string" minOccurs="1" />                                        
                    <xs:any processContents="lax" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="InvoiceBaseInfo" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="InvoiceDate" type="xs:string" minOccurs="1" />                  
                    <xs:element name="BillingEntityInvoiceNumber" type="xs:string" minOccurs="1" />                    
                    <xs:element name="ReceivedDate" type="xs:string" minOccurs="1" />                   
                    <xs:element name="AdjustedBilledAmount" type="xs:string" minOccurs="1" />                    
                    <xs:element name="UserFields" minOccurs="1" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:all>
                          <xs:element name="FirstApproverID" type="xs:string" minOccurs="1" />
                          <xs:element name="LastApproverID" type="xs:string" minOccurs="1" />
                          <xs:element name="LegalSpendCode" type="xs:string" minOccurs="0" />
                        </xs:all>
                      </xs:complexType>
                    </xs:element>
                     <xs:any processContents="lax" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="InvoiceMatter" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>                       
                    <xs:element name="Priority_CD" type="xs:string" minOccurs="1" />                   
                    <xs:element name="InvoiceMatterDetail" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>                        
                          <xs:any processContents="lax" maxOccurs="unbounded"/>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="InvoiceMatterAllocation" minOccurs="1" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>                          
                          <xs:element name="AllocationAmount" type="xs:string" minOccurs="1" />
                          <xs:element name="ChargeBackAccount1" type="xs:string" minOccurs="1" />
                          <xs:element name="ChargeBackAccount2" type="xs:string" minOccurs="1" />
                          <xs:element name="ChargeBackAccount3" type="xs:string" minOccurs="1" />
                          <xs:element name="UserFields" type="xs:string" minOccurs="0" />
                          <xs:any processContents="lax" maxOccurs="unbounded"/>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="InvoiceMatterApproval" minOccurs="1" maxOccurs="unbounded">                   
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="EmployeeName" type="xs:string" minOccurs="1" />                          
                          <xs:any processContents="lax" maxOccurs="unbounded"/>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>         
              <xs:any processContents="lax" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

1 Ответ

0 голосов
/ 24 октября 2018

Проблема в том, что ваша схема допускает любое количество элементов с именем InvoiceMatter, за которым следует элемент, который может иметь любое имя (включая имя InvoiceMatter);таким образом, если элемент InvoiceMatter найден, то неоднозначно, соответствует ли ему конкретная элементная частица или подстановочный знак.

XSD 1.1 решает это, говоря, что конкретная элементная частица всегда имеет приоритет, поэтому одним из решений является просто использованиеПроцессор XSD 1.1 (например, Saxon).

Если вы не можете сделать это, обычное решение XSD 1.0 - использовать атрибут targetNamespace в xs: любой подстановочный знак, чтобы ограничить его пространством имен (например, targetNamespace="##other"),Но это изменение в вашем дизайне;если вы хотите разрешить элементы в одном и том же пространстве имен, значит, у вас проблема.

...