【问题标题】:How to distinguish between attribute and element nodes returned from a Saxon XPathSelector如何区分从 Saxon XPathSelector 返回的属性节点和元素节点
【发布时间】:2016-06-22 14:31:01
【问题描述】:

给定 XML:

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

我希望 XPath /root/@name 返回 value,XPath /root/level1 返回 &lt;level1&gt; 节点的 XML 序列化:

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

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

我发现我可以调用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 检查以确定它是XdmAtomicValueXdmExternalObjectXdmFunctionItem 还是XdmNode,但元素和属性都是XdmNode 的实例。如何区分两者?

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

【问题讨论】:

    标签: java xpath saxon s9api


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-07
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      相关资源
      最近更新 更多