当前位置: 首页 > 知识库问答 >
问题:

XPath 1.0:选择属性与上下文节点的属性匹配的节点

公孙高轩
2023-03-14

我一直在用PHP的SimpleXMLIterator处理XML数据。

迭代一个子树(/根/条目)的节点时,我尝试从另一个子树(/根/条目值)收集相关数据-通过当前节点的属性匹配目标节点。

因此,我会在当前节点上使用XPath(“Context”;用注释标记),试图从(/根/entryvalues)中获取那些入口值(entryvalue)节点,这些节点的父节点具有与当前节点相同的名称属性值(“foo”)。

<root>
    <entries>
        <entry name="foo"><!-- <- XPath starts here ("Context") -->
            <somedata>1234</somedata>
        </entry>
        <entry name="bar">
            <somedata>asdf</somedata>
        </entry>
        ...
    </entries>
    <somethingUnrelated />
    <entryvalues>
        <entry name="foo"><!-- <- want to select subnodes of this node -->
            <entryvalue name="foo1">
                <text>Foo 1</text>
            </entryvalue>
            ...
            <entryvalue name="foo-n">
                <text>Foo n</text>
            </entryvalue>
        </entry>
        <!-- no "bar" here -->
        <entry name="quux">
            <entryvalue name="quux1">
                <text>Quux 1</text>
            </entryvalue>
        </entry>
        ...
    </entryvalues>
</root>

一个有效的XPath 2.0表达式可以是类似于父::*/跟随兄弟::entryvalue/entry[@name=当前()[@name]],但是我没有XPath 2.0,所以没有当前()函数。

如何获取这些节点?

作为参考,以下是相关的PHP片段:

$xml = new \SimpleXMLIterator($xmldata);
foreach ($xml->xpath('//root/entries/entry') as $entry) {

    // ... extract some data from $entry

    $entryvalues = $entry->xpath('???');
    doSomething($entry, $entryvalues);
}

共有1个答案

龙新荣
2023-03-14

该死的,在发帖后就发现了明显的问题(尽管我的头撞了几个小时,上下搜索了整个互联网):

通过PHP传输name属性值。就这么简单。

在我的情况下:

$template = 'parent::*/following-sibling::entryvalues/entry[@name = \'%s\']';

$xml = new \SimpleXMLIterator($xmldata);
foreach ($xml->xpath('//root/entries/entry') as $entry) {

    // ... extract some data from $entry
    $name = (string)$entry->attributes()['name'];

    $entryvalues = $entry->xpath(sprintf($template, $name));
    doSomething($entry, $entryvalues);
}

我的借口是,实际的代码封装得更多一点,所以我错过了给xpath()比静态字符串更多的选项。(尽管如此,我不知道如何单独使用XPath 1.0表达式,但我很高兴它能™工作。)

 类似资料:
  • 如何能够基于另一个同级节点的属性选择节点属性?我想要实现的是从所有节点中提取链接(href值),这些节点后跟具有属性class=“body table news loss”的节点跨度,即选择器应该返回https://finance.yahoo.com/news/inspiremd-announces-planned-recapitalization-120000752.html在下面的示例中。我试

  • 我有一个像这样的xml结构 我需要选择ClassX节点,并在包含constname1(即variable1)AttAttribute的值中 这起作用了。但是,我需要做如下操作,而不是在循环中混合文本 这是我不对的 然而下面是正确的 但我希望将选择范围限制为classX的节点

  • 主要内容:节点锚点,节点标签,节点内容每个表示节点包括两个主要特征,称为锚和标记。可以使用节点内容指定节点属性,从字符流中省略。 节点表示的基本示例如下 - 节点锚点 属性表示将来参考的节点。 节点中YAML表示的字符流用符号表示。 YAML处理器不需要保留锚名称以及其中包含的表示细节。以下代码解释了这一点 - 锚节点生成的YAML输出如下所示 - 节点标签 属性表示完全定义节点的本机数据结构的类型。 标签用()指示符表示。 标签被视

  • 问题内容: 我想使用XStream将对象序列化为这种形式的XML。 节点( 文本 )的值是序列化对象以及 att 属性上的字段。无需为此对象编写转换器就可以吗? 谢谢! 问题答案: 写一个转换器,应该类似于代码片段 在使用XStream时,注册转换器

  • 我正在尝试创建az xpath,我想在其中获取一个节点,其中存在一个具有属性的子节点。我的问题是,这个结构中唯一的区别是子属性。这里有一个例子来告诉你我的意思: 例如,给定UniqueName3,我想获取包含它的记录。到目前为止,我尝试了以下操作: 然而,有了这个,我得到了所有具有field_name属性的值节点。

  • 这是我的问题的一个细节。我需要使用XPath选择以下节点: 应该如何制定xpath查询来查找属性的值等于属性的值的所有节点? 当然完全容易--但我只是无法到达那里,在网上找不到任何合适的东西。