【发布时间】:2023-03-26 15:04:01
【问题描述】:
我正在测试一个 XML 结构:
<Articles>
...
<Article ID="333">
<author>Paul</author>
<title>i hate xpath </title>
<child1>bla</child1>
<child2>blabla
<subchild>
<subsubchild DEEP = "Attribute"></subsubchild> //this is my nightmare
</subchild>
</child2>
<child3>testing</child3>
</Article>
...
</Articles>
什么 XPath 表达式将获取和更新 subsubchild 属性值?如果父 ID(在本例中为 333)已知,我最关心的是获取和更新任何节点的子值,无论其位置有多深或多浅。
目前我用过:
$query= "//*[@ID=333]//*node()[@DEEP and @DEEP = "Attribute"]";
$outcome = $xml->xpath($query);
echo isset($outcome[0][0]) ? "found" : "unavailable";
还有其他几个相关的表达方式,它们都让我对 Invalid expression report 的努力感到沮丧。
function XMLChangeAttribValue($ParentID, $attirbName, $attribValue, $NewValue){
$xml //Never mind, i've create this sucessfully
$query = "//*[@ID=$ParentID]//*[@$attirbName = $attribValue]";
$outcome = $xml->xpath($query);
echo isset($outcome[0][0]) ? "found" : "unavailable";
}
【问题讨论】:
-
我不知道你的问题是什么。 “无效的表达式报告”是指 XPath 引擎报告错误吗?那么,请出示一下。你在使用 PHP 吗?然后,这样标记问题。 XPath 不是更新 XML 文档的正确工具,请将您的预期输出显示为 XML。
-
不要发表个人言论 - 它们并不完全有助于为您的问题找到一个好的答案。不过,解决我的 cmets 会有所帮助。
-
对不起,Mathias,如果我听起来不太好,我不是故意的,我只是对你说不能使用 xpath(或者更确切地说不是正确的工具)来更新 xml 感到惊讶。还有什么更好的?一个foreach循环?好吧,更新我的意思是我想将 DEEP(属性)的值更改为我选择的值。如果你有想法,请告诉我。再次接受我的道歉。
-
@OsagieOdigie,您的问题令人困惑,您在 cmets 中的回答也无济于事。 Mathias 非常“了解 wat 在地面上的情况”(对于对这种奇怪结构的任何合理解释),JLRishe 的回答是正确的。在你改进你的问题之前,我投票结束你在问什么不清楚:清晰的例子可以克服你可能遇到的任何英语流利度挑战,失去文字说话会显示对你的读者的尊重。谢谢。
-
我同意@kjhughes,如果你可以将“wanna”改为“want to”,“wat”改为“what”,“u”改为“you”,“pls”改为“please” (等)非常感谢 - 在您的帖子和您的 cmets 中。说流利英语的人不要求完美,也不要求学术水平的正式,但同样我们不希望 Stack Overflow 成为聊天室(或者更糟糕的是,类似于 YouTube cmets)。 IMO,避免文字朗读是朝着正确方向迈出的一步。