PHP xpath 查找元素

PHP xpath find elements

你好,我需要一些帮助来使用 PHP 和 xpath 找到我的 XML 元素。

这是我的一部分 xml:

 "processen": {
        "proces": [
            {
                "@attributes": {
                    "id": "B1221"
                },
                "velden": {
                    "kernomschrijving": "activiteit aanleggen alarminstallatie",
                    "model-kernomschrijving": "aanleggen alarminstallatie",
                    "naam": "Het beoordelen van een alarminstallatie",
                    "standaard-dossiernaam": {
                        "@attributes": {
                            "ref": "SCN0000029"
                        }
                    },
                    "[tag:taakveld]": "Bouwzaken & Procedures",
                    "proceseigenaar": "Bouwzaken",
                    "toelichting-proces": "bla die bla.",
                    "aanleiding": "Dit werkproces wordt intern getriggerd.",
                    "opmerking-proces": {
                        "@attributes": {
                            "ref": "SCN0000036"
                        }
                    },
                    "exportprofiel": {
                        "@attributes": {
                            "ref": "SCN0000037"
                        },
                    },...

比如我希望能够找到id(快速)并访问id B1221下的所有元素

我尝试了各种变体,但 none 有效:

$xml = simplexml_load_file( $filename );
$proces = $xml->xpath("//processen/proces/@attributes/id=B1221");
$proces = $xml->xpath("//processen/proces[@attributes/id=B1221]");

它总是returns一个空数组...

感谢您的帮助。

你在那里展示的不是XML;它是通过解析 XML 生成的 PHP 对象的某种表示形式,通过它您可以访问 XML.

的内容

这听起来像是一种迂腐的区分,但它实际上是您问题的关键:XPath 表达式并非特定于 PHP,因此不会搜索此结构;它们是搜索 XML 本身的标准语言。

因此,要构造正确的 XPath 表达式,您只需查看实际的 XML。从你展示的表现来看,我猜它看起来,部分是这样的:

<processen>
   <proces id="B1816">
       <velden>
            <kernomschrijving>activiteit aanleggen alarminstallatie</kernomschrijving>
            <model-kernomschrijving>aanleggen alarminstallatie</model-kernomschrijving>
            <naam>Het beoordelen van een alarminstallatie</naam>
       </velden>
   </proces>
</processen>

在 XPath 中,您可以按名称、带有前导 @ 的属性(如 id="...")和 double-quotes 中的文字字符串访问元素(标签)。 [...] 运算符的意思类似于“有”,因此 [@foo="bar"] 表示“具有属性 foo,其值为字符串 bar”。

这给了你这个:

$xml = simplexml_load_file( $filename );
$proces = $xml->xpath('//processen/proces[@id="B1816"]');
echo $proces[0]->asXML();

(这里是a live demo of that example。)

看起来你可能也有命名空间(名称中带有 : 的标签);这些需要一些额外的技巧 .