gpt4 book ai didi

java - 如何使用包含 Java 命名空间的 XPath 检索 XML 数据?

转载 作者:数据小太阳 更新时间:2023-10-29 01:56:43 25 4
gpt4 key购买 nike

我知道这个页面中有很多这个主题,但遗憾的是,我仍然无法找到我的解决方案..

这是我的 xml 代码:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:Request xmlns:ns1="http://www.sea.com">
<ns1:PayrollRequest>
<ns1:PayrollCost>
<ns1:PayrollID>123</ns1:PayrollID>
<ns1:BatchID>7770</ns1:BatchID>
<ns1:CompanyId>001</ns1:CompanyId>
<ns1:GrossPay>60000</ns1:GrossPay>
</ns1:PayrollCost>
</ns1:PayrollRequest>
</ns1:Request>

这是我的java代码:

import org.w3c.dom.*;
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import java.io.IOException;
import org.xml.sax.SAXException;

public class XPathTry {

public static void main(String[] args)
throws ParserConfigurationException, SAXException,
IOException, XPathExpressionException {

DocumentBuilderFactory domFactory =
DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("SamplePayroll2.xml");
XPath xpath = XPathFactory.newInstance().newXPath();


// display all
XPathExpression expr = xpath.compile("//PayrollCost/*/text()");


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

是的,像往常一样,我无法获得输出,因为它只显示:

Process exited with exit code 0.

只有当我删除 ns:1 时才会显示输出,xml 的代码如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns:ns1="http://www.sea.com">
<PayrollRequest>
<PayrollCost>
<PayrollID>123</PayrollID>
<BatchID>7770</BatchID>
<CompanyId>001</CompanyId>
<GrossPay>60000</GrossPay>
</PayrollCost>
</PayrollRequest>
</Request>

问题是,我在网上找到的所有建议似乎都没有用:

例如,我已经尝试过

/*/namespace::*[name()='']

//*[local-name() = 'Element' and namespace-uri() = namespace-uri(/*)]

/*[local-name()=' ']/*[local-name()=' ']/*[local-name()=' ']

等2..

我能得到的唯一最好的输出是,它将显示:

null

谁能给我正确的代码来解决我的问题?

提前致谢!

最佳答案

您将必须创建 javax.xml.namespace.NamespaceContext 的子类并将其设置在 xpath 上:

xpath.setNamespaceContext(new NamespaceContext() {

@SuppressWarnings("rawtypes")
@Override
public Iterator getPrefixes(final String namespaceURI) {
return Collections.singleton("ns1").iterator();
}

@Override
public String getPrefix(final String namespaceURI) {
return "ns1";
}

@Override
public String getNamespaceURI(final String prefix) {
return "http://www.sea.com";
}
});

然后您可以将命名空间前缀添加到 XPath 表达式中:

XPathExpression expr = xpath.compile("//ns1:PayrollCost/*/text()");

关于java - 如何使用包含 Java 命名空间的 XPath 检索 XML 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8221652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com