2012-12-19 94 views
5

我需要用java的XPath通過ID XML元素返回一個字符串。的Java的XPath返回整個元素作爲字符串

給出

...

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

返回值需要是...

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

我已經廣泛使用Google搜索並沒有什麼我曾嘗試已經能夠返回整個元素。希望Xpath是因爲我想通過id在任何級別查詢g標籤。

+0

也許使用正則表達式? http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+3

T恤 - 處理XML的正則表達式同是魔鬼的工作。 – jeremyjjbrown

回答

8

我找到了解決辦法是讓使用XPath的org.w3c.dom.Node中(DOM也會工作)。然後我從節點創建了一個javax.xml.transform.dom.DOMSource,並使用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(); 

這很容易考慮到類的重用。不幸的是,Java中沒有.OuterXml屬性,就像在.NET中一樣。你所有的.NETer現在都可以假笑。

2

沒有的XPath會返回一個包含字符串的XML語法,永遠。

+0

數字基於我遇到的情況。你是否有另一個解決方案的想法來滿足上述要求? – jeremyjjbrown

+2

使用xpath查找您關心的元素,然後使用通常的Java API將其序列化以將XML序列化爲字符串。 – bmargulies

+2

「沒有xpath有史以來」?這是相當嚴肅的措辭,有* *實現,其中可以寫'/ */g [@ id ='Outline']/outer-xml(。)' – BeniBela

0

我不知道關於Java,但在.NET世界人會用

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

這個問題明明說「java」,爲什麼還要提一下.net這裏 – lidermin

+0

@lidermin,是的,還有問題清楚地說「XPath」。除了「java」之外,問題顯然是用「xml」和「xpath」標記的。這個答案適用於問題的XPath/XML方面 - 涵蓋由標籤指示的三個區域中的兩個。作者明確地說:「希望Xpath」。一個人可能知道Java,但沒有XPath的知識,任何答案都將基本上不完整。如果你明白這一點,扭轉你的downvote將不勝感激。 –

+0

@Dimitre_Novatchev,好了,但沒必要投下來的下方僅僅因爲一個觀察我的回答,更是因爲我提供的解決方案甚至不是我的,我張貼的信用那裏,這將是任何其他的複製/粘貼在Java世界中有類似情況的人 – lidermin

0

我解決我的問題與此代碼:

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

貸:chick.Net

+0

謝謝,它適合我:) – Mankeomorakort