Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何区分从Saxon XPathSelector返回的属性节点和元素节点_Java_Xpath_Saxon_S9api - Fatal编程技术网

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

Java 如何区分从Saxon XPathSelector返回的属性节点和元素节点,java,xpath,saxon,s9api,Java,Xpath,Saxon,S9api,给定XML: <root name="value"> <level1> <level2>Text</level2> </level1> </root> 我使用的是Java中Saxon 9.6的a9api接口 我发现我可以调用来获取XPath计算结果的XML序列化,这会获得选择元素所需的结果,但在选择属性时返回name=“value”。我可以调用来获取,它为属性获取正确的值,但返回元素的文本内容 迈克尔·凯以

给定XML:

<root name="value">
  <level1>
    <level2>Text</level2>
  </level1>
</root>
我使用的是Java中Saxon 9.6的a9api接口

我发现我可以调用来获取XPath计算结果的XML序列化,这会获得选择元素所需的结果,但在选择属性时返回
name=“value”
。我可以调用来获取,它为属性获取正确的值,但返回元素的文本内容

迈克尔·凯以前也有过这样的经历。我可以看到,我可以执行
instanceof
检查,以确定它是否是
xdmotomicvalue
XdmExternalObject
XdmFunctionItem
XdmNode
,但元素和属性都是
XdmNode
的实例。我如何区分这两者


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

我在写完问题后发现了答案,因此我将与其他人分享

XdmItem
强制转换为
XdmNode
后,可以调用,该调用从枚举返回一个值,指定它是哪种类型的节点:

        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();
        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();