给定 XML:
<root name="value">
<level1>
<level2>Text</level2>
</level1>
</root>
我想要 XPath/root/@name
回来value
,和 XPath/root/level1
返回 XML 序列化<level1>
node:
<level1>
<level2>Text</level2>
</level1>
我在 Java 中使用 Saxon 9.6 的 a9api 接口。
我发现我可以打电话XdmValue.toString() http://www.saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XdmValue.html#toString()获取 XPath 评估结果的 XML 序列化,这会获取选择元素所需的结果,但会返回name="value"
选择属性时。我可以打电话XdmItem.getStringValue() http://www.saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XdmItem.html#getStringValue()得到字符串值 https://www.w3.org/TR/xpath-datamodel/#acc-summ-string-value,它为我提供正确的属性值,但返回元素的文本内容。
迈克尔·凯此前曾说“Saxon 的 s9api 接口...返回 XdmValue 对象,您可以查询其类型” https://stackoverflow.com/a/7018824/1216210。我可以看到我可以执行instanceof
检查以确定它是否是XdmAtomicValue
, XdmExternalObject
, XdmFunctionItem
, or XdmNode
,但元素和属性都是实例XdmNode
。我如何区分两者?
(我无法修改 XPath,因为它们是由用户提供的。)
我刚写完问题就发现了答案,所以我会分享给其他人。
铸造后XdmItem
to an XdmNode
,你可以打电话XdmNode.getNodeKind() http://www.saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XdmNode.html#getNodeKind(),它返回一个值XdmNodeKind http://www.saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XdmNodeKind.html指定节点类型的枚举:
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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)