gpt4 book ai didi

java - 使用 XPath 更改文本内容

转载 作者:行者123 更新时间:2023-12-01 11:54:05 25 4
gpt4 key购买 nike

虽然我可以使用下面的代码在节点内设置文本值

private static void setPhoneNumber(Document xmlDoc, String phoneNumber) {
Element root = xmlDoc.getDocumentElement();
Element phoneParent = (Element) root.getElementsByTagName("gl-bus:entityPhoneNumber").item(0);
Element phoneElement = (Element) phoneParent.getElementsByTagName("gl-bus:phoneNumber").item(0);
phoneElement.setTextContent(phoneNumber);
}

我无法对 XPath 执行相同的操作,因为节点对象为 null

private static void setPhoneNumber(Document xmlDoc, String phoneNumber) {
try {
NodeList nodes = (NodeList) xPath.evaluate("/gl-cor:entityInformation/gl-bus:entityPhoneNumber/gl-bus:phoneNumber", xmlDoc, XPathConstants.NODESET);
Node node = nodes.item(0);
node.setTextContent(phoneNumber);
} catch (XPathExpressionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

最佳答案

事实上,您正在使用非命名空间感知方法 getElementsByTagName(),并向其传递包含冒号的元素名称,这表明您在解析XML。如果您的 XML 是以命名空间感知的方式进行解析的,那么这应该不起作用,但类似

String namespace = // the namespace URI bound to the gl-bus prefix in your doc
Element phoneParent = (Element) root.getElementsByTagNameNS(namespace, "entityPhoneNumber").item(0);

可以正常工作。请注意,标准 Java DocumentBuilderFactory 默认情况下支持命名空间,您必须在工厂上调用 setNamespaceAware(true),然后再向其请求newDocumentBuilder

XPath 需要命名空间感知解析,如果您想通过 XPath 访问命名空间中的元素,则必须向 XPath 对象提供 NamespaceContext 来告知它使用什么前缀绑定(bind) - 它不会从原始 XML 继承前缀绑定(bind)。令人烦恼的是,核心 Java 库中没有提供 NamespaceContext 的默认实现,因此您必须编写自己的实现或使用第三方实现,例如 Spring's SimpleNamespaceContext 。这样:

SimpleNamespaceContext ctx = new SimpleNamespaceContext();
ctx.bindNamespaceUri("g", namespace); // the same URI as before
ctx.bindNamespaceUri("c", ...); // the namespace bound to gl-cor:
xPath.setNamespaceContext(ctx);

NodeList nodes = (NodeList) xPath.evaluate("/c:entityInformation/g:entityPhoneNumber/g:phoneNumber", xmlDoc, XPathConstants.NODESET);

关于java - 使用 XPath 更改文本内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28568942/

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