使用PHPDOM访问XML元素时,仅通过其名称和属性值


Accessing XML Elements using PHP DOM only by their Name and Attribute value?

如果只有元素的名称和能力id,如何在以下XML上打印能力-元素默认-属性值?

例如,如果我的名字是"steve",id是1003,我将如何选择并打印该能力的默认值,即"false"。

<Item Id="1">
<Name>Batman</Name>
<Ability Id="3001" Default="true">Super Strength</Ability>
<Ability Id="3002" Default="false">Master martial artist</Ability>
<Ability Id="3003" Default="false">Access to high tech</Ability>
</Item>
<Item Id="2">
<Name>Superman</Name>
<Ability Id="3004" Default="true">Flight</Ability>
<Ability Id="3005" Default="false">Super Strength</Ability>
<Ability Id="3006" Default="false">Super Speed</Ability>
<Ability Id="3007" Default="true">Stamina</Ability>
<Ability Id="3008" Default="false">Invulnerability</Ability>
</Item>
<Item Id="3">
<Name>Spiderman</Name>
<ScopeNotes/> <HistoryNotes/>
<Ability Id="219" Default="false">Super Reflex & Agility</Ability>
<Ability Id="567" Default="true">Spider Sense</Ability>
</Item>
<Item Id="4">
<Name>Steve</Name>
<Ability Id="1007" Default="false">Cake eating</Ability>
<Ability Id="1001" Default="true">Swearing</Ability>
<Ability Id="1002" Default="false">Watching movies</Ability>
<Ability Id="1003" Default="false">Steve</Ability>
</Item>

问题是每个元素都有不同数量的能力节点,并且名称"Steve"同时出现在名称和能力节点中。

我已经阅读了php-dom文档,以前也使用过它来循环项目和获取名称(例如,新的DOMDocument、加载文件、getElementsByTagName),但当您尝试执行上面解释的操作时,我很难理解它是如何工作的。

正如Bob Fincheimer所建议的那样,XPath应该是一种不错的方法。下面的路径应该会给你的结果

//Item[Name="Steve"]/child::Ability[@Id="1003"]/@Default

路径说明:

  1. //
    在文档中各处选择节点(我不知道完整的xml)
  2. Item
    选择<Item>-节点
  3. [Name="Steve"]
    选择具有nodeValue为"Steve"的子元素<Name>的节点
  4. child::Ability
    选择子节点<Ability>
  5. [@Id="1003"]
    选择Id属性设置为1003的节点
  6. @Default
    选择"默认"属性

对于给定的XML,它将返回一个具有1个属性节点(@Default="false") 的DOMNodeList

如何使用它?http://www.php.net/manual/de/domxpath.query.php

演示:http://codepad.org/qtgWXFtm