2016-03-31 11 views
0

ich eine XML-DateiAbrufen eines Attributwert einen anderen Attributwert in XML

<mxCell id="0"/> 

    <mxCell id="1" parent="0"/><mxCell connectable="0" id="2" parent="1"value="a=5" vertex="1"></mxCell> 

<mxCell id="3" parent="2" value="op1" vertex="1"></mxCell> 

<mxCell connectable="0" id="4" parent="1" value="b=8" vertex="1"></mxCell> 

<mxCell id="5" parent="4" value="ip1" vertex="1"></mxCell> 

<mxCell id="6" parent="4" value="op1" vertex="1"></mxCell> 

<mxCell connectable="0" id="7" parent="1" value="c=_x+_y" vertex="1"></mxCell> 

<mxCell id="8" parent="7" value="ip1" vertex="1"></mxCell> 

aus der XML-Datei i Wert von „id“ Attribut erhalten wollen wie folgt müssen, wo Wert von „parent =“ Attribut 4 "". Obwohl ich weiß, einfach die Attributwerte abzurufen, aber ich möchte den Attributwert durch den Attributwert eines anderen Attributs abrufen. Wie kann ich dies mithilfe von XML-Parser in JAVA tun?

+0

Schleife Throught Knoten (‚mxCell‘) und für jeden ‚Eltern‘ Wert suchen, wenn ‚4‘ gefunden wird, erhalten die ‚id‘ in einer Liste (oder besser, nimm den Knoten in einer Liste). – Tokazio

Antwort

0

Sie haben mehrere Möglichkeiten.

Eine besteht darin, Ihr XML in ein DOM (Document Object Model) umzuwandeln und einen XPath-Ausdruck darauf zu verwenden, um den gewünschten Wert zu erhalten. JDOM könnte gut passen. Siehe diese Frage und ihre Antwort für Beispiele: Select a node using xpath and jdom

Der XPath-Ausdruck, den Sie benötigen, ist //mxCell[@parent='4']/@id. Beachten Sie, dass Sie, wenn ein Standard-Namespace in Ihrem XML-Dokument definiert ist (Sie haben einen Auszug bereitgestellt, nicht das gesamte Dokument, also kann ich es nicht sagen), das an einen Präfix binden und im XPath-Ausdruck verwenden.

Eine weitere Option, die keine externen Abhängigkeiten erfordert, ist die Verwendung von XSLT. Überprüfen Sie das Paket javax.xml.transform für weitere Informationen. Ein Stylesheet, das würde nur ausgegeben, der Wert, den Sie zur Verfügung gestellt hier wollen:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="text" /> 

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

    <xsl:template match="//mxCell[@parent='4'][1]"> 
     <xsl:value-of select="@id" /> 
    </xsl:template> 

</xsl:stylesheet> 

Beachten Sie, dass dies das id-Attribut des ersten mxCell Elements mit einem übergeordneten Attribute nur dann ausgegeben, den Wert 4. Das hat das, was die [1] tut am Ende dieses XPath-Ausdrucks.

Wenn der zu suchende Wert dynamisch ist (statt immer 4), empfehle ich einen XSLT-Parameter zu verwenden, um ihn an den Transformator zu übergeben.

Um die Ausgabe der XSLT zu analysieren und mehrere Werte zu behandeln, überlasse ich es Ihnen. Es sollte einfach sein, von hier fortzufahren. Beachten Sie, dass der XSLT-Ansatz wahrscheinlich der leistungsfähigste sein wird. JDOM ist eine feine Bibliothek, aber für große Dokumente wird der Overhead ziemlich bedeutend sein, so dass die Speicherbenutzung ein Problem werden kann.

1

ich habe es getan, wie folgend

Element eElement=(Element)nNode; 
if(eElement.getAttribute("parent").equals("4") 
{ 
System.out.println("id"=+eElement.getAttribute("id")); 
} 
+0

Wenn dies Teil der Verarbeitung des Dokuments mit einem Parser sein muss, anstatt nur den Wert zu erhalten, ist das so ziemlich der einfachste und effizienteste Ansatz. –

Verwandte Themen