2012-12-19 11 views
5

È necessario utilizzare java xpath per restituire da id un elemento xml come stringa.Java xpath per restituire un intero elemento come stringa

proposta ...

<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> 

il valore restituito necessità di essere ...

<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> 

Googled ampiamente e niente che abbiamo provato è stato in grado di restituire l'intero elemento. Xpath è desiderato perché voglio interrogare i tag g a qualsiasi livello tramite id.

+0

Forse usare regex? http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+3

Tees - l'elaborazione di xml con regex è opera del diavolo. – jeremyjjbrown

risposta

8

La soluzione che ho trovato è stato quello di ottenere l'org.w3c.dom.Node con XPath (DOM funzionerebbe anche). Quindi ho creato un javax.xml.transform.dom.DOMSource dal nodo e l'ho trasformato in una stringa con 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(); 

Questo è facilmente scomposto in una classe da riutilizzare. Sfortunatamente, la proprietà no. OuterXml in Java come in .NET. Tutto ciò che puoi fare su .NETer ora è sorridendo.

2

No xpath restituirà una stringa contenente la sintassi XML, mai.

+0

Figure basate su ciò che ho incontrato. Hai un'idea di un'altra soluzione che soddisfi i requisiti sopra riportati? – jeremyjjbrown

+2

Usa un percorso x per trovare l'elemento che ti interessa e serializzalo usando la solita API Java per serializzare XML su una stringa. – bmargulies

+2

"Nessun xpath mai"? Questo è abbastanza seriamente scritto, Ci * sono * implementazioni, in cui puoi scrivere '/ */g [@ id = 'Outline']/outer-xml (.)' – BeniBela

0

Non so su Java, ma nel mondo .NET uno userò:

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

la domanda diceva chiaramente "java", perché anche menzionare .Net qui – lidermin

+0

@lidermin, Sì, e la domanda chiaramente detto "XPath". La domanda, oltre a "java", è chiaramente contrassegnata da "xml" e "xpath". Questa risposta è per il lato XPath/XML della domanda - copre due delle tre aree indicate dai tag. E l'autore dice esplicitamente: "Xpath è desiderato". Si può sapere Java, ma senza la conoscenza di XPath ogni risposta sarebbe sostanzialmente incompleta. Nel caso in cui tu capisca questo, sarebbe opportuno apprezzare l'inversione del tuo downvote. –

+0

@Dimitre_Novatchev, Ok, ma non c'è bisogno di votare la mia risposta qui sotto solo a causa di un'osservazione, ancor più dato che la soluzione che ho fornito non è nemmeno mia, ho postato i crediti lì e sarà una copia/incolla per ogni altro gente con una situazione simile nel mondo Java – lidermin

0

ho risolto il mio problema con questo codice:

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();   
} 

crediti verso: chick.Net

+0

Grazie, funziona per me :) – Mankeomorakort

Problemi correlati