【问题标题】:Can XPath 1.0 return XML Element names in manner similar to returning node attributes and text?XPath 1.0 能否以类似于返回节点属性和文本的方式返回 XML 元素名称?
【发布时间】:2012-01-31 18:40:53
【问题描述】:

问题: XPath 1.0 表达式能否只返回 xml 节点的名称(无论是否合格)而不是整个节点? XPath 2.0 也可以吗?


详情:

我正在为 xml 元素节点的使用分析一系列格式良好的 xml 文档(即,获取跨多个 xml 文档的 xml 节点的聚合计数)。我有一个 perl 脚本,它检索每个文档的所需节点集,然后使用 XML::XPath::Node::Element->getName 遍历每个节点以获取节点名称的计数。我有一个替代实现来分析 xml 节点属性和文本值,但使用 XPath 语句来检索“原子值”(而不是在 perl 中使用 XML::XPath::Node::Element->getAttribute() 或类似的)。

[请注意,我意识到“原子值”实际上是一组属性/文本节点。]

当允许 XPath 表达式返回所需的“原子值”而不是在 perl 中循环结果时,我的性能提高了 50 倍,因此我想以类似于属性的方式检索 xml 节点名称 (即'attribute::'或'@')和文本(即'text()')节点。我查看了 XPath 和 XML 规范,但无法确定解决方案。

编辑:更具体地说,我正在寻找类似 @​​987654321@ 的东西,但它会为所有匹配节点返回一组名称(而不是只找到第一个节点)。

【问题讨论】:

    标签: xml perl xpath


    【解决方案1】:

    在 XPath 1.0 数据模型中,没有字符串集这样的东西,因此无法返回一组节点的名称集作为结果。

    在 XPath 2.0 中这很简单:

    //*/local-name()
    

    【讨论】:

    • 我很抱歉 - 我基本上在同一个线程中提出了两个问题,从而混淆了讨论。感谢您提供 XPath 2.0 解决方案。一旦我可以实现对 XPath 2.0 的支持,我期待尝试该解决方案。
    【解决方案2】:

    XPath 1.0 是一个过滤器;它无法生成内容。如果不是 DOM 中的节点(元素节点、属性节点、文本节点等),则无法返回。这意味着 XPath 查询不能返回字符串。

    这就是为什么//*/local-name() 不可能工作的原因。

    【讨论】:

    • 同意 - 鉴于规范,我怀疑是否存在解决方案。但是,我希望有一个未在 XPATH/XML 规范中指定的实现,例如 XML 元素的隐含属性节点——类似于'//@name',其中“name”是隐含属性。据我所知,这种隐含属性不存在(但认为其他人可能有解决方法)。
    • @WMX,如果 XML::LibXML 出于任何原因动态生成属性节点,我相信我会听说过。我不知道其他 XPath 库是否真的实现了 XPath 以外的东西。
    • 是的 - 我实际上希望得到我在 XPath 规范中遗漏的东西,尽管它看起来越来越不可能。我同样怀疑实现会生成独立于规范的节点(我认为也不应该)。也许我会对 XPath 3.0 提出建议(虽然我还没有完全阅读 XPath 2.0 规范):-)
    • 关于“我实际上希望得到我在 XPath 规范中遗漏的东西”,这就是为什么我的回答说为什么这是不可能的。
    • //*/local-name() 不可能工作的语句是错误的。它在 XPath 1.0 中不起作用,但在 XPath 2.0 中起作用。因此,即使答案已被接受,也要对答案投反对票。
    【解决方案3】:

    你可以调用local-name函数:

    //*[local-name()='nodename']
    

    【讨论】:

    • 谢谢,但是在谓词中使用该函数会选择整个 xml 节点。我试图只提取 xml 节点名称——类似这样的东西(尽管这不是一个有效的 XPath 表达式):local-name(//*)
    • 糟糕 - local-name(//*) 有效,但只返回找到的第一个节点。我需要一组名字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2011-12-23
    • 2014-11-25
    相关资源
    最近更新 更多