2010-11-25 7 views
3

Ich bin auf der Suche nach Code, der Folgendes tun kann. Bei einem Ausschnitt aus XML, sagt:Gibt es eine Java-Bibliothek, um zu validieren, dass ein XML-Snippet eine Teilmenge einer größeren XML-Datei ist?

<c>Some text</c> 

und eine komplette XML-Datei:

<a> 
    <b> 
     <c>Some text</c> 
    </b> 
</a> 

prüfen, ob die Schnipsel sind in der Tat eine gültige Teilmenge der gesamten XML-Datei. Ich habe mir XMLUnit angesehen, was wirklich gut aussieht, aber es scheint, nur komplette Dateien gegeneinander zu validieren.

Für die Probe oben würde ein einfacher String-Vergleich funktionieren, aber andere Funktionen, die ich könnte sein, unterstützen möchte:

1) Reihenfolge der untergeordneten Elemente nicht wichtig. Z.B.

<b> 
    <c>Some text</c> 
    <d>Other text</d> 
</b> 

ist eine gültige Teilmenge von

<a> 
    <b> 
     <d>Other text</d> 
     <c>Some text</c> 
    </b> 
</a> 

2) Ignorieren Leerzeichen, Tabulatoren, neue Linien usw.
3) Ein schönes Skelett XMLUnit zu haben Merkmals würde, wo Knotennamen und Struktur geprüft , aber keine Inhaltswerte. Z.B. <c>Some text</c> wäre gültig im Vergleich zu <c>Other text</c>.

+1

Warum nicht 'xpath.evaluate()' Funktion für die Auswertung verwenden? –

+0

XML ist eine hierarchische Struktur, sodass jedes gültige XML-Fragment als vollständiges XML-Dokument interpretiert werden kann. Ich sehe kein Problem, irgendeine Art von XML-Validierung gegen Ihr Fragment foo ausführen. – AlexR

+0

@Die Elite Gentleman - Könnten Sie erweitern? Und könnte es optimiert werden, um die Punkte 1, 2 und 3 oben zu treffen? –

Antwort

1

Ich glaube nicht, dass es eine solche Bibliothek gibt, aber Sie könnten sie auf folgende Weise lösen (wenn Ihr xml-Fragment mit einem Element beginnt). Ich nehme an, Sie sind mit XMLUnit vertraut.

public boolean isSubset(Document document, Element element) { 
    NodeList list = document.getElementsByTagName(element.getNodeName()); 
    for (int i = 0; i < list.getLength(); i++) { 
     Element el = (Element) list.item(i); 
     Document clone = toNewDocument(el); 
     //compare element with clone with XMLUnit 
     //... 
     if (equal) { 
      return true; 
     } 
    } 
    return false; 
} 

private Document toNewDocument(Element el) { 
    // createing a new DOM-document... 
    Document document = documentBuilder.newDocument(); 
    Node node = document.importNode(el, true); 
    document.getDocumentElement().appendChild(node); 
    return document; 
} 
+0

Danke dmitry747, das sieht wirklich gut aus. Ich werde es versuchen. –

Verwandte Themen