2009-07-08 19 views
3

Ich versuche XML-Includes zu verwenden, um eine große XML-Struktur zu verwalten, die sowohl von Menschen als auch von Computern verwendet werden kann.XInclude Schema/Namespace Validierung?

Es treten jedoch unzählige Probleme beim Versuch auf, XML-Dateien zu erstellen, die anhand eines vorhandenen Schemas validiert werden können. Hier ist ein vereinfachtes Beispiel für das, was ich versuche zu tun.

Meine Datei "main.xml" wird 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 Datei "child.xml" wird als eigenständige Datei überprüft.

<?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 im Zusammenhang mit Namensraum, aber ich bin ratlos, wie mein Problem zu beheben.

+0

Welchen Fehler bekommen Sie bei der Validierung? – skaffman

+0

Beim Analysieren der main.xml sehe ich den Fehler: "Das Attribut 'schemaLocation' verweist auf ein Schema, dessen Ziel-Namespace bereits zur Validierung verwendet wurde." - In Altovas XML-Spion. – Nate

+0

Das XML-Validierungs-Plugin von Notepad ++ gibt Folgendes an: "Element '{http://www.w3.org/2001/XInclude] include': Dieses Element wird nicht erwartet. Erwartet wird ({http://www.example.com/main} Kind). " – Nate

Antwort

5

Als skaffman bereits hingewiesen, XML-Schema und XInclude sind nicht kompatibel.

Die Meldung Validierungsfehler 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 zitieren: „XInclude keine Beziehung zu dem erweiterten InfoSet definiert, indem ein XML-Schema erzeugte solche Augmented infoset wie geliefert werden können. das Input-Infoset oder eine solche Augmentation könnte auf den Infoset, der aus dem Einschluss resultiert, angewendet werden. "

Daher sollten Sie zunächst die gesamte XML-Datei mit XIncludes erstellen und anschließend validieren.

Bearbeiten: Sie können xmllint mit --xinclude verwenden, um main.xml zu validieren.

+0

--xinclude Flagge funktionierte für mich, danke – wulfgarpro

2

Ich glaube nicht, dass die XML Schema und XInclude Spezifikationen garantiert miteinander kompatibel sind. Einzelne XML-Prozessoren erlauben dies möglicherweise, andere jedoch nicht.

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

P.S. Ich bin mir nicht sicher, warum Sie das für ein Namespace-Problem halten. Was gibt dir diesen Eindruck?

0

Ich glaube nicht, dass dies durch eine Inkompatibilität zwischen XInclude und Schema verursacht wird; es sieht für mich so aus, als ob das Include nicht vor der Validierung verarbeitet wird. Daher erlaubt das Schema kein "include" -Element in main, nur ein "child" -Element. Wenn Sie Ihren XML-Prozessor zwingen könnten, Includes vor der Validierung zu verarbeiten ...

2

Ich stimme mit grantwparks überein - XInclude und XML Schema können absolut zusammen verwendet werden. Die Spezifikationen sind absichtlich unabhängig voneinander. Anscheinend wollten die Autoren von XInclude die Freiheit bieten, die Includes vor der Validierung oder nach der Validierung verarbeiten zu lassen.

Diese thread on velocityreviews diskutiert die Frage und die Antwort, die mir geholfen, die Sache this post on xml.com war zu verstehen, unter Angabe von ihm:

One of the most common questions about XInclude is how inclusion interacts with validation, XSL transformation, and other processes that may be applied to an XML document. The short answer is that it doesn't. XInclusion is not part of any other XML process. It is a separate step which you may or may not perform when and where it is useful to you.

For example, consider validation against a schema. A document can be validated before inclusion, after inclusion, or both. If you validate the document before the xi:include elements are replaced, then the schema has to declare the xi:include elements just like it would declare any other element. If you validate the document after the xi:include elements are replaced, then the schema has to declare the replacement elements. Inclusion and validation are separate, orthogonal processes that can be performed in any order which is convenient in the local environment

Also, was es, zu kochen scheint nach unten wird die XML-Tools zu erhalten, zu verarbeiten das xi: Elemente vor der Validierung einbeziehen (das ist das Beispiel des OP). Im XML-Editor von Eclipse gibt es beispielsweise eine Einstellung "XML-Einschlüsse verarbeiten" unter XML -> XML-Dateien -> Validierung (mit RSA 8.5), die aktiviert werden muss, damit der Editor zuvor xi: include verarbeiten kann Validierung.

Andy