35

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

这是一些示例 XML:

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

我想选择who's type is的所有<data>标签子项的内容。<object>me

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

4

2 回答 2

53

试试这个 XPath:

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

内容如下:

  • Select ( /) 当前元素的子元素称为object
  • 选择 ( /) 他们的孩子叫data
  • 过滤器 ( [...]) 列出的元素...
    • 属性type@意思是“属性”)
    • 有文本值me

所以:

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

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

于 2009-06-14T08:40:52.353 回答
5

我只是做了一个函数来为我做这件事;它只获得了第一个结果。你的旅费可能会改变。

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>
于 2012-05-26T01:17:50.540 回答