2012-12-19 27 views
5

Tôi cần sử dụng java xpath để trả về bằng id id phần tử xml dưới dạng chuỗi.Java xpath để trả lại toàn bộ phần tử dưới dạng chuỗi

cho ...

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

giá trị trả về nhu cầu được ...

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

Tôi có googled rộng rãi và không có gì tôi đã cố gắng đã có thể trả lại toàn bộ phần tử. Xpath là mong muốn bởi vì tôi muốn truy vấn thẻ g ở mọi cấp độ theo id.

+0

Có lẽ sử dụng regex? http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+3

Tees - xử lý xml với regexes là công việc của ma quỷ. – jeremyjjbrown

Trả lời

8

Các giải pháp tôi tìm thấy là để có được những org.w3c.dom.Node với xpath (DOM cũng sẽ hoạt động). Sau đó, tôi đã tạo ra một javax.xml.transform.dom.DOMSource từ nút và chuyển đổi nó thành một chuỗi với 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(); 

Điều này dễ dàng được đưa vào lớp học để sử dụng lại. Thật không may, không có thuộc tính .OuterXml trong Java như có trong .NET. Tất cả các bạn NETER có thể smirk bây giờ.

2

Không có xpath nào cũng trả về một chuỗi chứa cú pháp XML.

+0

Số liệu dựa trên những gì tôi đã gặp phải. Bạn có ý tưởng về một giải pháp khác có thể lấp đầy các yêu cầu ở trên không? – jeremyjjbrown

+2

Sử dụng một xpath để tìm phần tử bạn quan tâm và sau đó tuần tự hóa nó bằng cách sử dụng Java API thông thường để tuần tự hóa XML thành một chuỗi. – bmargulies

+2

"Không có xpath bao giờ"? Đó là khá nghiêm túc worded, Có * là * triển khai, trong đó bạn có thể viết '/ */g [@ id = 'Phác thảo']/outer-xml (.)' – BeniBela

0

Tôi không biết về Java, nhưng trong thế giới NET ai sẽ sử dụng:

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

câu hỏi rõ ràng đã nói "java", tại sao thậm chí còn đề cập đến .Net tại đây – lidermin

+0

@lidermin, Có, và câu hỏi nói rõ ràng "XPath". Câu hỏi, bên cạnh "java" được gắn thẻ rõ ràng với "xml" và "xpath". Câu trả lời này dành cho phía XPath/XML của câu hỏi - bao gồm hai trong ba khu vực được chỉ định bởi các thẻ. Và tác giả nói rõ ràng: "Xpath là mong muốn". Người ta có thể biết Java nhưng không có kiến ​​thức về XPath, bất kỳ câu trả lời nào cũng sẽ không hoàn chỉnh. Trong trường hợp bạn hiểu điều này, việc đảo ngược lời bình luận của bạn sẽ được đánh giá cao. –

+0

@Dimitre_Novatchev, Ok, nhưng không cần phải bình chọn câu trả lời của tôi dưới đây chỉ vì một quan sát, thậm chí nhiều hơn cho rằng giải pháp tôi cung cấp thậm chí không của tôi, tôi đăng các khoản tín dụng ở đó và nó sẽ là một bản sao/dán cho bất kỳ dân gian với một tình huống tương tự trong thế giới Java – lidermin

0

tôi giải quyết vấn đề của tôi với mã này:

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

Tín dụng cho: chick.Net

+0

Cảm ơn, nó làm việc cho tôi :) – Mankeomorakort

Các vấn đề liên quan