gpt4 book ai didi

java - 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:13 26 4
gpt4 key购买 nike

给定 XML:

<root name="value">
<level1>
<level2>Text</level2>
</level1>
</root>

我想要 XPath /root/@name返回 value , 和 XPath /root/level1返回 <level1> 的 XML 序列化节点:

  <level1>
<level2>Text</level2>
</level1>

我在 Java 中使用来自 Saxon 9.6 的 a9api 接口(interface)。

我发现我可以调用 XdmValue.toString() 获取 XPath 评估结果的 XML 序列化,这使我获得了选择元素所需的结果,但返回 name="value"选择属性时。我可以调用 XdmItem.getStringValue() 得到string value ,它为我提供了正确的属性值,但返回了元素的文本内容。

Michael Kay 之前有 said "Saxon's s9api interface ... returns XdmValue objects whose type you can interrogate" .我可以看到我可以执行 instanceof检查以确定它是否是 XdmAtomicValue , XdmExternalObject , XdmFunctionItem , 或 XdmNode , 但元素和属性都是 XdmNode 的实例.如何区分这两者?

(我无法修改 XPath,因为它们是由用户提供的。)

最佳答案

我刚写完问题就发现了答案,所以我会分享给其他人。

XdmItem 转换为 XdmNode 后,您可以调用 XdmNode.getNodeKind() ,它从 XdmNodeKind 返回一个值枚举指定它是哪种类型的节点:

        XdmValue matchList = xPathSelector.evaluate();
XdmItem firstItem = matchList.itemAt(0);
if (firstItem instanceof XdmNode) {
XdmNode xdmNode = (XdmNode) firstItem;
XdmNodeKind nodeKind = xdmNode.getNodeKind();
if (nodeKind == XdmNodeKind.ELEMENT) {
return xdmNode.toString();
}
}
return firstItem.getStringValue();

关于java - 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37971101/

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