SimpleXML xpath到具有特定属性值的元素?

时间:2015-02-24 23:15:27

标签: php xml xpath xml-parsing simplexml

我有一些像这样的XML:

<item>
    <custom-attributes>
      <custom-attribute attribute-id="taco">false</custom-attribute>
      <custom-attribute attribute-id="htmlContent" xml:lang="en-US">testValue</custom-attribute>
      <custom-attribute attribute-id="htmlContent" xml:lang="default">testing123</custom-attribute>
  </custom-attribute>
</item>

如何使用xpath查找custom-attribute元素,而不是taco的属性ID?

如何使用xpath查找custom-attribute元素而不是htmlContent的属性-id?在这种情况下有2个。这些也有名称空间。我不确定这是否重要。

我尝试过这样的事情:

var_dump($xml->xpath("custom-attribute[@attribute-id='taco']"));

但这不起作用。我可以通过custom-attribute元素迭代并查找我需要的内容,但只需通过xpath选择它就会容易得多。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

在xpath的开头添加双斜杠:

$source = <<<X
<item>
    <custom-attributes>
      <custom-attribute attribute-id="taco">false</custom-attribute>
      <custom-attribute attribute-id="htmlContent" xml:lang="en-US">testValue</custom-attribute>
      <custom-attribute attribute-id="htmlContent" xml:lang="default">testing123</custom-attribute>
  </custom-attributes>
</item>
X;

$xml = new SimpleXMLElement($source);

$taco             = $xml->xpath("//custom-attribute[@attribute-id='taco']")[0];
$htmlContentArray = $xml->xpath("//custom-attribute[@attribute-id='htmlContent']");

echo "taco       : ", $taco, PHP_EOL;
echo "htmlContent: ", implode(', ', $htmlContentArray), PHP_EOL;

输出:

taco       : false
htmlContent: testValue, testing123

<强>更新

对于您在评论中提出的问题,关于在item节点内进行搜索;您可以使用.//从当前节点开始搜索。

// Find an item, then do an xpath on the result of that
// to find the custom attribute element.
// <items> tag added as <item> would otherwise be the root element,
// which would make the example quite pointless.
$source = <<<X
<items>
    <item>
        <custom-attributes>
            <custom-attribute attribute-id="taco">false</custom-attribute>
            <custom-attribute attribute-id="htmlContent" xml:lang="en-US">testValue</custom-attribute>
            <custom-attribute attribute-id="htmlContent" xml:lang="default">testing123</custom-attribute>
        </custom-attributes>
    </item>
    <item>
        <custom-attributes>
            <custom-attribute attribute-id="taco">true</custom-attribute>
            <custom-attribute attribute-id="htmlContent" xml:lang="en-US">item 2 testValue</custom-attribute>
            <custom-attribute attribute-id="htmlContent" xml:lang="default">item 2 testing456</custom-attribute>
          </custom-attributes>
    </item>
</items>
X;

$xml = new SimpleXMLElement($source);

$item             = $xml->item[1]; // Get second item
$taco             = $item->xpath(".//custom-attribute[@attribute-id='taco']");
$htmlContentArray = $item->xpath(".//custom-attribute[@attribute-id='htmlContent']");

echo "taco from second item: ", $taco[0], PHP_EOL;
echo "html from second item: ", implode(', ', $htmlContentArray), PHP_EOL;

输出:

taco from second item: true
html from second item: item 2 testValue, item 2 testing456