我一直在用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);
}
该死的,在发帖后就发现了明显的问题(尽管我的头撞了几个小时,上下搜索了整个互联网):
通过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查询来查找属性的值等于属性的值的所有节点? 当然完全容易--但我只是无法到达那里,在网上找不到任何合适的东西。