【问题标题】:Java How to extract a complete XML blockJava 如何提取完整的 XML 块
【发布时间】:2023-03-15 00:05:01
【问题描述】:

使用这个 XML 示例:

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

我想要一个简单的方法来提取节点B的XML块,返回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?

【问题讨论】:

    标签: java xml xpath xom


    【解决方案1】:

    引用第二个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) + "]");
    }
    

    【讨论】:

    • 谢谢,但我已经知道了。我需要提取该节点的完整 XML 字符串。
    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多