2009-08-19 10 views
1

ich glaube, die Lösung für mein Problem ist sehr einfach, aber ich konnte es nicht fint So, hier ist:XML Schema: Verschiedene Elementnamen (Sequenz)

ich eine XML haben, die eine Liste von Elementen mit verschiedenen Namen, aber in Reihenfolge. Ein Beispiel:

<DOC> 
<DOC_OBL_1> 
    <TIP_DOC_OBL>1</TIP_DOC_OBL> 
</DOC_OBL_1> 
<DOC_OBL_2> 
    <TIP_DOC_OBL>2</TIP_DOC_OBL> 
</DOC_OBL_2> 
<DOC_OBL_3> 
    <TIP_DOC_OBL>3</TIP_DOC_OBL> 
</DOC_OBL_3> 
</DOC> 

Also, ich habe 3 Elemente: DOC_OBL_1, DOC_OBL_2 und DOC_OBL_3. Und ja, es könnte Nummer 4, 5, 6, etc. Wie Sie sehen können, haben alle 3 die gleichen Elemente im Inneren (eigentlich haben sie eine Menge von ihnen, aber nicht wichtig, jetzt richtig), und ich dachte, ich könnte einen allgemeinen Typ deklarieren, der diese Art von Dokumenten validieren kann.

Wie kann ich dies mit einem Schema validieren ???

Ich weiß, es ist eine sehr hässliche XML (vielleicht ist es nicht Standard, bitte sagen Sie mir, ich weiß es nicht), aber es ist nicht meine Sorge, dieses Dokument zu bauen. Ich muss es nur analysieren, validieren und transformieren.

Antwort

2

Nun, sicher können Sie! Ganz einfach eigentlich: Wenn die Struktur die gleiche für jedes Element ist, können Sie eine einzelne <xs:complexType> definieren, das zu bestätigen, und dann verwenden:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="DOC" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="DOC"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="DOC_OBL_1" type="DocType" /> 
     <xs:element name="DOC_OBL_2" type="DocType" /> 
     <xs:element name="DOC_OBL_3" type="DocType" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:complexType name="DocType"> 
    <xs:sequence> 
     <xs:element name="TIP_DOC_OBL" type="xs:string" minOccurs="0" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

funktioniert das für Sie? Behandelt es alle Ihre Bedürfnisse?

Wie Zach ganz richtig hervorhebt - diese "Lösung" ist offensichtlich eher begrenzt, da sie nicht mit einer beliebigen Anzahl von Tags DOC_OBL_1, DOC_OBL_2, ...., DOC_OBL_x - dem Namen und damit der Nummer von Tags müssen im Voraus bekannt sein.

Das ist bedauerlich, aber es ist die einzige Lösung, angesichts dieser verkrüppelten XML. Die REAL Lösung wäre etwas zu haben, wie:

<DOC> 
    <DOC_OBL id="1"> 
    </DOC_OBL> 
    <DOC_OBL id="2"> 
    </DOC_OBL> 
    ..... 
    <DOC_OBL id="x"> 
    </DOC_OBL> 
</DOC> 

und dann würde das XML-Schema noch einfacher geworden und mit einer beliebigen Anzahl von <DOC_OBL> Tags umgehen konnte.

Aber das GIGO-Prinzip gilt: Garbage In, Garbage Out ==> Es kommt zu einer fehlerhaften XML-Struktur, nur eine beschissene, unvollständige Validierung ist möglich.

Marc

+1

@marc_s, wenn es irgendeine Zahl des DOC könnte \ _OBL \ _1, DOC \ _OBL \ _2, DOC \ _OBL \ _N Knoten, ist es eine Möglichkeit, gegen das Schema gegen die Elementnamen zu tun irgendeine Art von Regex zu validieren ? –

+0

Nein, das ist leider nicht möglich, fürchte ich. Sie können nur den tatsächlichen Tag-Namen als Elementnamen haben, oder Sie müssten einen festen Tag-Namen und den variablen Teil (fortlaufende Nummer) in einem Attribut dieses Tags haben. –

+0

Danke. Ich denke, ich werde dies mit mindestens 50 Elementen tun (DOC_OBL_1 ... DOC_OBL_50). Hässlicher Eingang -> hässliche Lösung ..: D Aber es würde sowieso funktionieren. – eLZahR

2

Seine bedauerlich, dass die XML-Elementnamen in ihnen grundsätzlich Sequenznummern/Bezeichner haben. Ich würde sagen, das ist schlecht definiertes (nicht standardmäßiges) XML.

In meiner begrenzten (!) Erfahrung bedeutet dies, dass das xsd-Schema alle möglichen "DOC_OBL_N" -Elemente enthalten muss, die in der Sequenz definiert sind. Dies ist wahrscheinlich nicht praktikabel, wenn es keine theoretische Obergrenze für ihre Anzahl gibt.

Solange seine gültige xml, könnten Sie es laden und zählen alle Kinder des Elements DOC und schreiben Sie dann das Schema im laufenden Betrieb, aber das klingt wie es selbst zu besiegen.

Das kann Sie manuell Validierung der XML-Instanz mit einigen XPaths verlassen - eine Art Brute-Force-Ansatz und nicht technisch validieren gegen ein xsd-Schema.

+0

Die Eingabe ist ein riesiges Dokument, so dass mehr Code als ein einfacher Schmea nicht realisierbar ist. – eLZahR