Domanda

Sto cercando di usare XML include per aiutare a gestire una grande struttura XML che ha bisogno di essere utilizzabile da entrambi gli esseri umani e macchine.

Ma sto vivendo una miriade di problemi quando si cerca di costruire file XML che possono essere convalidati contro uno schema esistente. Ecco un esempio semplificato di quello che sto cercando di fare.

Il mio file "main.xml" non convalida.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Main.xml - This fails to validate. -->
<ns1:main xsi:schemaLocation="http://www.example.com/main main.xsd"
          xmlns:ns1="http://www.example.com/main"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xi="http://www.w3.org/2001/XInclude">

    <name>String</name>
    <xi:include href="child.xml"/> <!-- What I'm trying to do. -->

</ns1:main>

Il file "child.xml" valida fino come file autonomo.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Child.xml - This validates fine, as a standalone file. -->
<ns1:child xsi:schemaLocation="http://www.example.com/main main.xsd"
           xmlns:ns1="http://www.example.com/main"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <name>String</name>
    <age>String</age>

 </ns1:child>

Ecco il mio schema:

 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Main.xsd - My Simplified Schema -->
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:ns1="http://www.example.com/main"
            targetNamespace="http://www.example.com/main">

    <!-- Main Element (References Child) -->
    <xs:element name="main">
         <xs:complexType>
             <xs:sequence>
                 <xs:element name="name" type="xs:string"/>
                 <xs:element ref="ns1:child"/>
             </xs:sequence>
         </xs:complexType>
    </xs:element>

    <!-- Child Element -->
    <xs:element name="child">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="age" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
     </xs:element>

</xs:schema>

I miei problemi sono quasi ovviamente legati a spazi dei nomi, ma io sono in perdita per come risolvere il mio problema.

È stato utile?

Soluzione

skaffman già sottolineato, XML Schema e XInclude non sono compatibili.

Il messaggio di errore di convalida da xmllint l'afferma chiaramente:

main.xml:9: element include: Schemas validity error : Element  '{http://www.w3.org/2001/XInclude}include': This element is not expected. Expected is ( {http://www.example.com/main}child ).
main.xml fails to validate

Per citare il W3C Raccomandazione : "XInclude definisce alcuna relazione con le infoset aumentata prodotte applicando uno schema XML. tale infoset aumentata può essere fornita come infoset ingresso, o tale aumento potrebbe essere applicato alla infoset risultante dalla inclusione ".

In questo modo si dovrebbe prima di costruire l'intero file XML applicando i XIncludes, e convalidare il file in seguito.

Modifica:. È possibile utilizzare xmllint con --xinclude per convalidare main.xml

Altri suggerimenti

Sono d'accordo con grantwparks - XInclude e XML Schema assolutamente possono essere utilizzati insieme. Le specifiche sono volutamente indipendenti l'uno dall'altro. A quanto pare di XInclude gli autori hanno voluto fornire la libertà di lasciare che la include essere elaborati prima della convalida o dopo la convalida.

su velocityreviews discute l'emissione e la risposta che mi ha aiutato a capire la questione era questo post su xml.com , citando da esso:

  

Una delle domande più comuni su XInclude è come inclusione   interagisce con la convalida, XSL trasformazione, e altri processi   che può essere applicato a un documento XML. La risposta breve è che essa   non lo fa. XInclusion non è parte di qualsiasi altro processo XML. È un   fase separata che si può o non può eseguire quando e dove è   utile a voi.

     

Si consideri ad esempio la convalida rispetto a uno schema. Un documento può essere   convalidati prima dell'inclusione, dopo l'iscrizione, o di entrambi. Se si convalida   il documento prima della xi: include elementi sono sostituiti, poi la   schema deve dichiarare xi: include elementi, proprio come farebbe   dichiarare qualsiasi altro elemento. Se si convalida il documento dopo la   xi: include elementi vengono sostituiti, quindi lo schema deve dichiarare la   elementi di ricambio. Inclusione e validazione sono separati,   processi ortogonali che possono essere eseguite in qualsiasi ordine che è   comoda nell'ambiente locale

Quindi, ciò che sembra ridursi a, è quello di ottenere i vostri strumenti XML per elaborare xi: include elementi prima convalida (questo è ciò che l'esempio delle esigenze OP). Ad esempio, nel editor XML di Eclipse, v'è un'impostazione "Processo XML Inclusioni" sotto XML -> File XML -> Validation (utilizzando RSA 8.5), che deve essere attivata per ottenere l'editor per elaborare xi: include prima convalida.

Andy

Non credo che lo schema XML e XInclude specifiche sono garantiti per essere compatibili tra loro. processori XML individuali potrebbero permetterlo, ma altri no.

Come regola generale, direi che i due non dovrebbero essere utilizzati insieme.

P.S. Non sono sicuro che il motivo per cui si pensa che questo è un problema dello spazio dei nomi. Cosa ti dà questa impressione?

Non credo che questo è causato da un'incompatibilità tra XInclude e dello schema; sembra a me come l'inclusione non è in fase di elaborazione prima della convalida. Così lo schema non consente per un elemento "includere" solo in un elemento principale, "bambino". Se si potesse forzare il processore XML di processo include prima della convalida ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top