2012-12-19 14 views
5

Potrzebuję użyć java xpath, aby zwrócić przez id element xml jako ciąg znaków.Java xpath, aby zwrócić cały element jako ciąg

podane ...

<svg> 
    <g id="Background"> 
    </g> 
    <g id="Outline"> 
     <polygon fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round"  stroke-miterlimit="10" points=" 119.813,57.875 119.188,57.87" /> 
    </g> 
    <g id="Base_Colour" transform="matrix(0.25 0 0 0.25 0 0)"> 
     <path fill="#ADB1AF" d="M112.25,208l-8,20.25l-0.5-1.75l0.75-0.5v-1.5l0.75-0.5v-1.5L106,222v-1.5l0.75-0.5v-1.5l0.75-0.5v-1.5"/> 
     <path fill="#625595" d="M112.25,208l5.25-14.5l30-30.25l2.25-1.5l41.5-20.5l49.75-9.5h4.25l49,3l48.75"/> 
    </g> 
</svg> 

wartość zwracana musi być ...

<g id="Outline"> 
    <polygon fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round"  stroke-miterlimit="10" points=" 119.813,57.875 119.188,57.87" /> 
</g> 

Mam google obszernie i nic próbowałem był w stanie wrócić cały element. Xpath jest pożądana, ponieważ chcę wysłać zapytanie o znaczniki g na dowolnym poziomie przez id.

+0

Może użyć wyrażenia regularnego? http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+3

Tees - przetwarzanie xml z wyrażeń regularnych jest dziełem diabła. – jeremyjjbrown

Odpowiedz

8

Rozwiązanie znalazłem było uzyskać org.w3c.dom.Node z XPath (DOM też by działało). Następnie utworzyłem javax.xml.transform.dom.DOMSource z węzła i przekształciłem go w ciąg znaków z javax.xml.transform.TransformerFactory.

Node node = // the node you want to serialize 
xmlOutput = new StreamResult(new StringWriter()); 
transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
transformer.transform(new DOMSource(node), xmlOutput); 
String nodeAsAString = xmlOutput.getWriter().toString(); 

Można to łatwo dodać do klasy do ponownego wykorzystania. Niestety, nie jest to właściwość .OuterXml w Javie, ponieważ istnieje w .NET. Wszystkie twoje .NETer mogą się teraz uśmiechnąć.

2

Żadne xpath nie zwróci łańcucha zawierającego składnię XML, nigdy.

+0

Dane na podstawie tego, co napotkałem. Czy masz pomysł na inne rozwiązanie, które spełniłoby powyższe wymagania? – jeremyjjbrown

+2

Użyj xpath, aby znaleźć element, który cię interesuje, a następnie serializuj go przy użyciu zwykłego interfejsu API języka Java, aby przekształcić kod XML na ciąg znaków. – bmargulies

+2

"Brak xpath ever"? Jest to dość poważnie sformułowane, tam * są * implementacje, w których można napisać '/ */g [@ id = 'Outline']/outer-xml (.)' – BeniBela

0

nie wiem o Java, ale w świecie .NET będzie użyć:

doc.DocumentElement.SelectSingleNode("/*/g[@id='Outline']").OuterXml 
+1

pytanie wyraźnie powiedział "java", dlaczego nawet wspominając .Net tutaj – lidermin

+0

@lidermin, Tak, i pytanie wyraźnie powiedział "XPath". Pytanie, oprócz "java", jest wyraźnie oznaczone "xml" i "xpath". Ta odpowiedź dotyczy strony XPath/XML pytania - obejmuje dwa z trzech obszarów wskazanych przez znaczniki. I autor wyraźnie mówi: "Xpath jest pożądany". Można znać Javę, ale bez znajomości XPath każda odpowiedź byłaby zasadniczo niekompletna. W przypadku, gdy to zrozumiesz, docenisz odwrócenie swojego spadku. –

+0

@Dimitre_Novatchev, Ok, ale nie trzeba głosować w dół moją odpowiedź poniżej tylko z powodu obserwacji, tym bardziej, że podane przeze mnie rozwiązanie nie jest nawet moje, napisałem tam kredyty i będzie to kopiuj/wklej dla każdego innego folk z podobną sytuacją w świecie Java – lidermin

0

mi rozwiązać mój problem z tym kodem:

public static String getOuterXml(Node node) 
    throws TransformerConfigurationException, TransformerException { 
    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.setOutputProperty("omit-xml-declaration", "yes"); 

    StringWriter writer = new StringWriter(); 
    transformer.transform(new DOMSource(node), new StreamResult(writer)); 
    return writer.toString();   
} 

kredyty: chick.Net

+0

Dzięki, to działa dla mnie :) – Mankeomorakort

Powiązane problemy