SimpleXML:选择具有特定属性值的元素

dim*_*414 32 php xml xpath simplexml netflix

在XML文档中,我有共享相同名称的元素,但属性的值定义了它的数据类型,我想从文档中选择所有具有特定值的元素.我是否需要使用XPath(如果是这样,您能建议正确的语法)还是有更优雅的解决方案?

这是一些XML示例:

<object>
  <data type="me">myname</data>
  <data type="you">yourname</data>
  <data type="me">myothername</data>
</object>
Run Code Online (Sandbox Code Playgroud)

我想选择所有类型的<data>孩子的内容.<object>me

PS - 我正在尝试使用PHP与Netflix API进行交互 - 这对我的问题无关紧要,但如果你想提出一个好的/更好的方法,我会全力以赴.

Gum*_*mbo 48

试试这个XPath:

/object/data[@type="me"]
Run Code Online (Sandbox Code Playgroud)

所以:

$myDataObjects = $simplexml->xpath('/object/data[@type="me"]');
Run Code Online (Sandbox Code Playgroud)

如果object不是您的文档的根,请//object/data[@type="me"]改用.


wil*_*ley 5

我刚刚做了一个功能来为我做这件事;不过,它只获取第一个结果。你的旅费可能会改变。

function query_attribute($xmlNode, $attr_name, $attr_value) {
  foreach($xmlNode as $node) { 
    if($node[$attr_name] == $attr_value) {
        return $node;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

echo query_attribute($MySimpleXmlNode->Customer, "type", "human")->Name;
Run Code Online (Sandbox Code Playgroud)

(对于下面的 XML)

<Root><Customer type="human"><Name>Sam Jones</name></Customer></Root>
Run Code Online (Sandbox Code Playgroud)

  • 为什么不建议使用 XPath Gumbo?为什么使用 switch 而不是更容易阅读的 `if($node[$attr_name] == $attr_value)`? (11认同)