使用PHP DOM仅通过其Name和Attribute值访问XML元素?

时间:2012-09-12 22:34:34

标签: php domdocument

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

例如,如果我的名字为'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)但我很难理解当你尝试做我喜欢的事情时它是如何工作的已经解释过了。

1 个答案:

答案 0 :(得分:1)

正如Bob Fincheimer所建议的那样,XPath应该是一个很好的方法。 以下路径应该为您提供结果

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

路径说明:

  1. //
    选择文档中的所有节点(我不知道完整的xml)
  2. Item
    选择<Item> - 节点
  3. [Name="Steve"]
    使用nodeValue“Steve”
  4. 选择具有子元素<Name>的节点
  5. child::Ability
    选择子节点<Ability>
  6. [@Id="1003"]
    选择Id-attribute设置为1003
  7. 的节点
  8. @Default
    选择默认属性
  9. 对于给定的XML,它将返回一个带有1个attribute-node (@Default="false")

    的DOMNodeList

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

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