java - 如何解析xml并获取特定元素的内容

标签 java xpath xml-parsing

我的 xml 字符串是

Got message from Queue ==> <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003
/05/soap-envelope"><soapenv:Body><ns1:PostPublicationResponse xmlns:ns1="http://www.openoandm.org/xml/ISBM/"><ns1:Messag
eID>urn:uuid:7d361fb0-bc54-48bd-bbd1-6e34960ef3f8</ns1:MessageID><ns1:MessageContent><MessageContent xmlns="http://www.o
penoandm.org/xml/ISBM/"><hi>k786</hi></MessageContent></ns1:MessageContent></ns1:PostPublicationResponse></soapenv:Body>
</soapenv:Envelope>

现在我已经编写了一个函数,试图获取元素 MessageContent 的内容,即 <hi>k786</hi> 但我总是得到空值。 我解析上面 xml 的函数是:

private String parseQueueMessage(String message)
        throws ParserConfigurationException, SAXException, IOException,
        XPathExpressionException {
    String resultMsg = "";
    DocumentBuilderFactory domFactory = DocumentBuilderFactory
            .newInstance();
    domFactory.setNamespaceAware(true);

    DocumentBuilder builder = domFactory.newDocumentBuilder();

    Document doc = builder.parse(new InputSource(new java.io.StringReader(
            message)));

    XPath xpath = XPathFactory.newInstance().newXPath();
    // XPath Query for showing all nodes value

    xpath.setNamespaceContext(new NamespaceContext() {

        @SuppressWarnings("rawtypes")
        @Override
        public Iterator getPrefixes(String arg0) {
            return null;
        }

        @Override
        public String getPrefix(String arg0) {
            return null;
        }

        @Override
        public String getNamespaceURI(String arg0) {
            if("xmlns:ns1".equals(arg0)) {
                return "http://www.openoandm.org/xml/ISBM/";
            }
            return null;
        }
    });


    XPathExpression expr = xpath.compile("//xmlns:ns1:MessageContent");

    Object result = expr.evaluate(doc, XPathConstants.NODESET);

    NodeList nodes = (NodeList) result;
    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println("The message obtained after parsing : "
                + nodes.item(i).getNodeValue());
        resultMsg = nodes.item(i).getNodeValue();
    }

    return resultMsg;
}

我在这里做错了什么? 提前致谢

最佳答案

在从 XPATH 中选择之前,您需要先定义 namespace URI。例如,首先在根上定义命名空间 URI,如下所示;

element.setAttribute("xmlns:ns1", "http://www.openoandm.org/xml/ISBM/");
xpath.compile("//ns1:MessageContent");

关于java - 如何解析xml并获取特定元素的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16075301/

相关文章:

java - JSP Servlet 上传图像文件

javascript - 无法让 xpath 在 javascript 上工作

flutter - 如何在 Flutter 中从 XML 中获取文本值

xmllint:使用以下方式从列表中获取项目

java - Spring MVC 绑定(bind)问题

java - Spring 分段上传

java - 在 Java 中使用 XPath 解析 XML

XMLStarlet、XPath - 如何根据节点删除属性

java - XML 解析器保留所有空白、属性排序、引号、CDATA、命名空间等

java - ServerBootstrap绑定(bind)方法