2010-03-26 4 views
5

Aufgabe: Ich habe ein vorhandenes XML-Dokument (UTF-8), die XML-Namespaces und XML-Schema verwendet. Ich muss zu einem bestimmten Element analysieren, den Inhalt anfügen (der auch XML-Namespace-Präfixe verwenden muss) und dann das Dokument erneut ausschreiben.beste Java Xml-Parser zu bearbeiten/bearbeiten ein vorhandenes XML-Dokument

Welches ist die beste XML-Parser-Bibliothek, die ich für diesen TASK verwenden sollte?

Ich habe einen früheren Thread (Best XML parser for Java) gesehen, war aber nicht sicher, ob dom4j oder JDOM namespaces/xmlSchema gut ist und gute Unterstützung für UTF-8-Zeichen.

Einige Parser, der für
JDom
Dom4J
XOM
Woodstock

Jede Idee, was man am besten wie eine Aufgabe zu sein scheint? :-) Ich benutze JDK 6 und würde es vorziehen, NICHT die eingebauten SAX/DOM-Einrichtungen zu benutzen, um diesen Job zu machen, weil das erfordert, dass ich zu viel Code schreibe.

Würde helfen, einige Beispiele für eine solche Aufgabe zu haben.

+0

Wie tut das mit dem eingebauten in DOM-Anlage gehen zu viel zu sein, zu codieren? Ah, richtig - Java ... ;-) Aber im Ernst: Sind deiner Meinung nach 15-20 Zeilen zu viel Code? Was wäre dann akzeptabel? – Thomas

+0

Die beste XML-Verarbeitungs-Lib für Heavy-Duty-Aufgaben ist vtd-xml, bar none ... http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf –

Antwort

5

Mit JDOM, einen Inputstream zu nehmen und ihnen ein Dokument zu machen:

InputStream inputStream = (InputStream)httpURLConnection.getContent(); 
DocumentBuilderFactory docbf = DocumentBuilderFactory.newInstance(); 
docbf.setNamespaceAware(true); 
DocumentBuilder docbuilder = docbf.newDocumentBuilder(); 
Document document = docbuilder.parse(inputStream, baseUrl); 

An diesem Punkt haben Sie die XML in einem Java-Objekt. Erledigt. Einfach.

Sie können entweder das Dokumentobjekt und die Java-API verwenden, um einfach durch sie zu gehen, oder auch XPath verwenden, was ich leichter finde (sobald ich es gelernt habe).

Erstellen Sie eine XPath-Objekt, das ein wenig nimmt:

public static XPath buildXPath() { 
    XPathFactory factory = XPathFactory.newInstance(); 
    XPath xpath = factory.newXPath(); 
    xpath.setNamespaceContext(new AtomNamespaceContext()); 
    return xpath; 
} 


public class AtomNamespaceContext implements NamespaceContext { 

    public String getNamespaceURI(String prefix) { 
     if (prefix == null) 
      throw new NullPointerException("Null prefix"); 
     else if ("a".equals(prefix)) 
      return "http://www.w3.org/2005/Atom"; 
     else if ("app".equals(prefix)) 
      return "http://www.w3.org/2007/app"; 
     else if ("os".equals(prefix)) 
      return "http://a9.com/-/spec/opensearch/1.1/"; 
     else if ("x".equals(prefix)) 
      return "http://www.w3.org/1999/xhtml"; 
     else if ("xml".equals(prefix)) 
      return XMLConstants.XML_NS_URI; 
     return XMLConstants.NULL_NS_URI; 
    } 

    // This method isn't necessary for XPath processing. 
    public String getPrefix(String uri) { 
     throw new UnsupportedOperationException(); 
    } 

    // This method isn't necessary for XPath processing either. 
    public Iterator getPrefixes(String uri) { 
     throw new UnsupportedOperationException(); 
    } 
} 

Dann ist es nur verwenden, die (zum Glück) gar nicht viel Zeit in Anspruch nehmen:

return Integer.parseInt(xpath.evaluate("/a:feed/os:totalResults/text()", document)); 
+0

+1 - JDOM ist die einfachste API zu lernen dafür. XSLT wird jedoch eine bessere Wahl sein, wenn Sie solche Aufgaben oft haben. – jsight

5

Verwenden Sie XSLT. Ernst. Das ist eine perfekte Arbeit dafür. Verwenden Sie einfach eine Kopiervorlage, um alles zu kopieren, bis auf den Platz, an dem Sie mehr XML hinzufügen müssen. Sie können das XML sogar hinzufügen, indem Sie XML anstelle von DOM-Manipulation schreiben.

Dies ist die Kopiervorlage:

<xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

ich eine Menge Leute XSLT wissen hassen, aber das ist eine Aufgabe, wo es wirklich und nimmt fast keinen Code leuchten würde. Außerdem könnten Sie einfach verwenden, was im JDK ist.

1

Es klingt wie Sie können ein XSLT-Stylesheet schreiben, um zu tun, was Sie wollen.

2

Da zu viel schreiben Code ist das Hauptproblem für Sie, Sie könnten joox betrachten wollen:

http://code.google.com/p/joox/

Ich habe jOOX zu einem Port von jQuery zu Java gemacht. Die zugrunde liegende Technologie ist das Standard-DOM von Java.Einige Beispielcode:

// Find the order at index for and add an element "paid" 
$(document).find("orders").children().eq(4) 
      .append("<paid>true</paid>"); 

// Find those orders that are paid and flag them as "settled" 
$(document).find("orders").children().find("paid") 
      .after("<settled>true</settled>"); 

// Add a complex element 
$(document).find("orders").append(
    $("order", $("date", "2011-08-14"), 
      $("amount", "155"), 
      $("paid", "false"), 
      $("settled", "false")).attr("id", "13"); 

Hinweis: Namensräume sind noch nicht explizit unterstützt, aber Sie können arbeiten, um das

+0

JOOX ist gute Ideen. Aber ich habe Zeit verloren, weil diese Technologie die Manipulation mit Attributen nicht unterstützt. Ohne sie ist diese Technologie nur zum Lesen geeignet. – wojand

+0

@wojand: Was lässt dich so denken? jOOX ermöglicht die Manipulation von Attributen. Siehe das dritte Beispiel in meiner Antwort, in dem 'id = "13" ' –

+0

angezeigt wird. Zeigen Sie mir, wie Attribute zum vorhandenen Tag hinzugefügt werden. Sie können ein Tag hinzufügen, aber das Problem liegt vor, wenn Sie dem vorhandenen Tag Attribute hinzufügen müssen. Ich konnte keine einfache Lösung finden. Ich habe für dieses Problem kein Beispiel auf der jOOX-Seite gefunden. Über Ihrem Beispiel hängt das Tag mit dem Attribut an, aber wie kann man nur ein Attribut an $ {} WITHOUT tag anhängen? – wojand

Verwandte Themen