gpt4 book ai didi

java - 在 Java 中使用 XPath 解析 SOAP 消息

转载 作者:行者123 更新时间:2023-11-30 07:07:44 24 4
gpt4 key购买 nike

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ParentNode xmlns="http://namespace">
<Status>Some_status</Satus>
<Data>
<Row>Some_row_data</Row>
</Data>
</ParentNode>
</soap:Body>
</soap:Envelope>

在 API 调用中生成结构与上述类似的 SOAP 消息

SOAPMessagesoapMessage = getSoapMessage()

我想要做的是能够在我的 sope 消息之上运行 xPath 查询,即我想获取 Row 节点中的数据。

我做了什么:

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
xPath.setNamespaceContext(new NamespaceContext() {
@Override
public String getNamespaceURI(String prefix) {
return "http://namespace";
}

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

@Override
public Iterator getPrefixes(String namespaceURI) {
System.out.println(namespaceURI);
return null;
}
});

SOAPBody body = soapMessage.getSoapBody();
Document document = body.extractContentAsDocument();

NodeList list = (NodeList)xPath.compile("/").evaluate(document, XPathConstants.NODESET);
Node node = list.item(0);
System.out.println(node.getFirstChild().getNodeName());

在根节点上运行它一切都很好,ParentNode 会打印到控制台。

但是,设置用以下内容替换我的 xPath 评估:

NodeList list = (NodeList)xPath.compile("/ParentNode").evaluate(document, XPathConstants.NODESET);

结果是一个空列表。我认为它与 namespace 有关,因此我用以下内容替换了查询:

NodeList list = (NodeList)xPath.compile("/*[name()='ParentNode']").evaluate(document, XPathConstants.NODESET);

这个似乎工作正常。我的问题是,如何正确设置命名空间上下文,以便我可以使用 xPath 查询,而无需在每个节点周围使用 name()=... ?我是否需要使用 DocumentBuilder 工厂并将其命名空间感知设置为 true?如果是这样,我如何将此 SOAP 消息提供给该工厂?

最佳答案

har07建议,向我的 xPath 查询添加任意前缀是正确解析我的 namespace 的技巧。结果,以下查询有效:

NodeList list = (NodeList)xPath.compile("/arbitraryprefix:ParentNode").evaluate(document, XPathConstants.NODESET);

关于java - 在 Java 中使用 XPath 解析 SOAP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39799999/

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