Frage

Ich versuche, XML zu verwenden, enthält eine große XML-Struktur, um die Verwaltung, die beide verwendbar sein muss, von Mensch und Maschine.

Aber ich eine Vielzahl von Problemen auftreten, wenn man versucht XML-Dateien zu erstellen, die gegen ein vorhandenes Schema validiert werden können. Hier ist ein vereinfachtes Beispiel, was ich zu tun werde versuchen.

Meine "main.xml" Datei nicht validiert.

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

Die "child.xml" Datei validiert Fein als eigenständige Datei.

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

Hier ist mein 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>

Meine Fragen sind fast offensichtlich auf Namespace verwendet, aber ich bin ratlos, wie mein Problem lösen kann.

War es hilfreich?

Lösung

Wie skaffman bereits darauf hingewiesen, XML Schema und XInclude sind nicht kompatibel.

Die Validierung Fehlermeldung von xmllint Staaten dies deutlich:

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

die W3C Recommendation zu zitieren: „XInclude definiert keine Beziehung zu augmentierten InfoSet durch Anlegen eines XML-Schema erzeugt werden. eine solche Augmented infoset kann als Eingangs infoset geliefert werden, oder eine solche Verstärkung kann mit dem infoset aus der Einbeziehung resultierende angewendet werden. "

So sollten Sie zunächst die gesamte XML-Datei erstellen, indem die XIncludes aufbringt und bestätigen Sie diese Datei danach.

Edit:. Sie können mit xmllint mit --xinclude main.xml zu validieren

Andere Tipps

Ich bin mit grantwparks - XInclude und XML-Schema kann absolut zusammen verwendet werden. Die technischen Daten sind absichtlich unabhängig voneinander. Anscheinend sind die Autoren von XInclude wollte die Freiheit schaffen, damit der vor der Validierung verarbeitet werden enthält oder nach der Validierung.

Der Thread auf velocityreviews die Frage und die Antwort diskutiert das half mir die Sache war diesen Beitrag zu verstehen, auf xml.com unter Angabe von ihr:

  

Eine der am häufigsten gestellten Fragen über XInclude ist, wie Inklusion   interagiert mit Validierung, XSL-Transformation und anderen Prozessen   das kann in ein XML-Dokument angewandt werden. Die kurze Antwort ist, dass es   nicht. XInclusion ist nicht Bestandteil eines anderen XML-Prozesses. Es ist ein   separater Schritt, die Sie nicht ausführen können oder wann und wo es ist   nützlich für Sie.

     

Betrachten wir zum Beispiel die Validierung gegen ein Schema. Ein Dokument kann sein   überprüft, bevor die Aufnahme, nach der Aufnahme, oder beides. Wenn Sie validieren   das Dokument vor dem xi: Elemente enthalten, werden ersetzt, dann ist die   Schema hat das xi zu deklarieren: umfassen Elemente wie wäre es   ein beliebiges anderes Element deklarieren. Wenn Sie bestätigen das Dokument nach der   xi: include Elemente ersetzt werden, dann hat das Schema der erklären   Ersatzelemente. Integration und Validierung sind getrennt,   Orthogonal Prozesse, die in beliebiger Reihenfolge durchgeführt werden können, das ist   bequem in der lokalen Umgebung

Also, was es nach unten zu kochen scheint, ist die XML-Tools zu erhalten, das xi zu verarbeiten: include Elemente vor der Validierung (das ist, was das Beispiel des OP Bedarfs). Zum Beispiel im XML-Editor von Eclipse, gibt es eine Einstellung „Process XML Einbeziehungen“ unter XML -> XML-Dateien -> Validierung (unter Verwendung von RSA 8,5), die den Editor bearbeiten xis werden muss, eingeschaltet zu erhalten: include vor Validierung.

Andy

Ich glaube nicht, dass die XML-Schema und XInclude Spezifikationen garantiert sind miteinander kompatibel sein. Einzelne XML-Prozessoren erlauben könnten, aber andere nicht.

Als allgemeine Regel gilt, würde ich sagen, dass die beiden nicht zusammen verwendet werden.

P. S. Ich bin mir nicht sicher, warum Sie denken, das ein Namespace Problem. Was gibt Ihnen diesen Eindruck?

Ich glaube nicht, dass dies durch eine Inkompatibilität zwischen XInclude und Schema verursacht wird; es scheint mir, wie die enthalten wird, bevor die Validierung nicht verarbeitet werden. Damit das Schema erlaubt es nicht, für ein „include“ Element in main, nur ein „Kind“ Elemente. Wenn Sie Ihren XML-Prozessor zwingen könnten, zu Prozess vor der Validierung umfasst ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top