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

2022-08-30 13:23:58

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

下面是一些示例 XML:

<object>
  <data type="me">myname</data>
  <data type="you">yourname</data>
  <data type="me">myothername</data>
</object>

我想选择谁的类型的所有标签子项的内容。<data><object>me

PS - 我正在尝试使用PHP与Netflix API接口 - 这对我的问题来说无关紧要,但是如果您想建议一种好/更好的方法来做到这一点,我全都听见了。


答案 1

试试这个 XPath:

/object/data[@type="me"]

其内容为:

  • 选择当前元素的 () 个子元素,称为/object
  • 选择()他们的孩子叫/data
  • 过滤 () 该列表到元素,其中 ...[...]
    • 属性(表示“属性”)type@
    • 具有文本值me

所以:

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

如果不是 文档的根目录,则可能需要改用。意思是“找到所有后代”,而不是“找到所有孩子”。object//object/data[@type="me"]//


答案 2

我刚刚制作了一个函数来为我做这件事;不过,它只抓住了第一个结果。您的里程可能会有所不同。

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

用法:

echo query_attribute($MySimpleXmlNode->Customer, "type", "human")->Name;

(对于下面的 XML)

<Root><Customer type="human"><Name>Sam Jones</name></Customer></Root>

推荐