2012-01-23 2 views
4

Используя этот XML пример:Java Как извлечь весь блок XML

<A> 
    <B> 
    <id>0</id> 
    </B> 
    <B> 
    <id>1</id> 
    </B> 
</A> 

Я хочу простой способ извлечения XML блок узла B, возвращая XML-строку:

<B> 
    <id>1</id> 
</B> 

К получить этот узел, я должен использовать некоторую библиотеку Java XPath, такую ​​как XOM или Java XPath, но я не мог найти, как получить полную XML-строку.

Я нашел два равнозначных ответил на вопросы, используя C#: C# How to extract complete xml node set и how can I extract an XML block from an XML document?

ответ

24

Добавление к решению lwburk, в преобразовать DOM узла в виде строки, вы можете использовать Transformer:

private static String nodeToString(Node node) 
throws TransformerException 
{ 
    StringWriter buf = new StringWriter(); 
    Transformer xform = TransformerFactory.newInstance().newTransformer(); 
    xform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    xform.transform(new DOMSource(node), new StreamResult(buf)); 
    return(buf.toString()); 
} 

Полный пример:

public static void main(String... args) 
throws Exception 
{ 
    String xml = "<A><B><id>0</id></B><B><id>1</id></B></A>"; 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    Document doc = dbf.newDocumentBuilder().parse(new InputSource(new StringReader(xml))); 

    XPath xPath = XPathFactory.newInstance().newXPath(); 
    Node result = (Node)xPath.evaluate("A/B[id = '1']", doc, XPathConstants.NODE); 

    System.out.println(nodeToString(result)); 
} 

private static String nodeToString(Node node) 
throws TransformerException 
{ 
    StringWriter buf = new StringWriter(); 
    Transformer xform = TransformerFactory.newInstance().newTransformer(); 
    xform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    xform.transform(new DOMSource(node), new StreamResult(buf)); 
    return(buf.toString()); 
} 
+1

он отлично работает – rhodan

+0

работает как шарм :) – paary

+0

нашел это после долгого поиска, сделал трюк для меня – codah

5

Выражение необходимо обратиться к этому второму B элемент должен выглядеть примерно так:

/*/B[id='1'] 

Или, если целевой узел находится в неизвестном месте в документе, использует:

//B[id='1'] 

Полный Java пример (предполагая, что XML в файле с именем workbook.xml):

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
Document doc = builder.parse("workbook.xml"); 
XPath xpath = XPathFactory.newInstance().newXPath(); 
XPathExpression expr = xpath.compile("//B[id='1']");   

NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
for (int i = 0; i < nodes.getLength(); i++) { 
    System.out.println("[" + nodes.item(i) + "]"); 
} 
+0

спасибо, но я уже знал это. Мне нужно извлечь всю XML-строку этого узла. – rhodan

Смежные вопросы