Question

Je suis en train d'utiliser XML COMPREND pour aider à gérer une grande structure XML qui doit être utilisable par les humains et les machines.

mais je rencontre une myriade de problèmes lorsque vous essayez de construire des fichiers XML qui peuvent être validées par rapport à un schéma existant. Voici un exemple simplifié de ce que je suis en train de le faire.

Mon fichier "main.xml" ne valide pas.

<?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>

Le fichier "child.xml" valide bien en tant que fichier autonome.

<?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>

Voici mon schéma:

 <?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>

Mes problèmes sont presque évidemment liés à namespaces mais je suis à une perte pour savoir comment résoudre mon problème.

Était-ce utile?

La solution

skaffman a déjà indiqué, le schéma XML et XInclude ne sont pas compatibles.

Le message d'erreur de validation de xmllint états clairement:

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

Pour citer le Recommandation W3C : « XInclude ne définit aucune relation avec les infosets produits par application augmentée d'un schéma XML. un tel ensemble d'information augmentée peut être fourni en tant que infoset entrée ou telle augmentation pourrait être appliquée à l'ensemble d'information résultant de l'inclusion ».

Ainsi, vous devez d'abord construire l'ensemble du fichier XML en appliquant les XIncludes, et valider ce fichier par la suite.

Modifier. Vous pouvez utiliser xmllint avec --xinclude pour valider main.xml

Autres conseils

Je suis d'accord avec grantwparks - XInclude et XML Schema absolument peuvent être utilisés ensemble. Les spécifications sont volontairement indépendantes les unes des autres. Apparemment, les auteurs de XInclude voulaient offrir la liberté de laisser includes être traitées avant la validation ou après validation.

sur velocityreviews discute de la question et la réponse qui m'a aidé à comprendre la question était ce post sur xml.com , citant il:

  

L'une des questions les plus courantes sur XInclude est de savoir comment l'inclusion   interagit avec validation, transformation XSL, et d'autres processus   qui peut être appliqué à un document XML. La réponse courte est que   ne fonctionne pas. XInclusion ne fait pas partie d'un autre processus XML. C'est un   étape séparée que vous pouvez ou ne pouvez pas effectuer quand et où il est   utile pour vous.

     

Par exemple, considérons la validation contre un schéma. Un document peut être   validée avant l'inclusion, après prise en compte, ou les deux. Si vous validez   le document avant la xi: include éléments sont remplacés, le   schéma doit déclarer le xi: inclure des éléments comme il le ferait   déclarer tout autre élément. Si vous validez le document après la   xi: inclure des éléments sont remplacés, le schéma doit déclarer la   éléments de remplacement. L'inclusion et la validation sont séparés,   processus orthogonales qui peuvent être effectuées dans un ordre quelconque qui est   pratique dans l'environnement local

Alors ce qu'il semble faire bouillir jusqu'à, est d'obtenir vos outils XML pour traiter les éléments xi: include avant la validation (c'est-ce que l'exemple des besoins OP). Par exemple, dans l'éditeur XML d'Eclipse, il y a un paramètre « processus Inclusions XML » sous XML -> fichiers XML -> Validation (en utilisant RSA 8.5), qui doit être mis en marche pour obtenir l'éditeur de traiter xi: include avant validation.

Andy

Je ne pense pas que les spécifications du schéma XML et XInclude sont garantis pour être compatibles les uns avec les autres. processeurs XML individuels pourraient permettre, mais d'autres non.

En règle générale, je dirais que les deux ne devraient pas être utilisés ensemble.

P.S. Je ne sais pas pourquoi vous pensez que cela est un problème d'espace de noms. Qu'est-ce que vous donne cette impression?

Je ne pense pas que cela est dû à une incompatibilité entre XInclude et le schéma; il me semble que l'inclure ne sont pas en cours de traitement avant la validation. Ainsi, le schéma ne permet pas un élément « inclure » dans le principal, seul un élément « enfant ». Si vous pouvez forcer votre processeur XML à traiter avant la validation comprend ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top