按属性名称获取XML节点

时间:2017-08-30 22:18:59

标签: php xml

我有以下XML结构:

   <Folder>
      <Placemark>
        <ExtendedData>
          <Data name="Id">
            <value>152285415</value>
          </Data>
          <Data name="Name">
            <value>Tester</value>
          </Data>
        </ExtendedData>
      </Placemark>
    </Folder>

我需要直接访问-Object的属性&#34; name&#34; =&#34; Id&#34;。

所以我尝试了这个:

$xml->Document->Folder->Placemark->ExtendedData->xpath('data[@name="Id"]')

但是给出了空数组。

我最终需要的是&#34; 152285415&#34;

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:1)

这似乎可以完成这项工作:

<?php

$xml = '<Folder>
      <Placemark>
        <ExtendedData>
          <Data name="Id">
            <value>152285415</value>
          </Data>
          <Data name="Name">
            <value>Tester</value>
          </Data>
        </ExtendedData>
      </Placemark>
    </Folder>';

$xml = simplexml_load_string($xml);

foreach($xml->Placemark->ExtendedData->Data as $item) {

    if($item->attributes()['name'] == 'Id') {
        echo $item->value;
    }

}

答案 1 :(得分:1)

您可以使用XPath直接访问所需内容:

<?php
$xml = '<Folder>
      <Placemark>
        <ExtendedData>
          <Data name="Id">
            <value>152285415</value>
          </Data>
          <Data name="Name">
            <value>Tester</value>
          </Data>
        </ExtendedData>
      </Placemark>
    </Folder>';

$xml = new SimpleXMLElement($xml);
$result = $xml->xpath('/Folder/Placemark/ExtendedData/Data[@name="Id"]');
echo "Value: ".$result[0]->value; // Value: 152285415

Demo

答案 2 :(得分:0)

不要担心文档的整体层次结构(虽然这被滥用了很多)是使用//作为XPath的第一部分。所以查询可以写成......

<?php
error_reporting ( E_ALL );
ini_set ( 'display_errors', 1 );

$xmlDoc = <<<XML
<Folder>
  <Placemark>
    <ExtendedData>
      <Data name="Id">
        <value>152285415</value>
      </Data>
      <Data name="Name">
        <value>Tester</value>
      </Data>
    </ExtendedData>
  </Placemark>
</Folder>
XML;

$xml = new SimpleXMLElement($xmlDoc);
$value = $xml->xpath('//Data[@name="Id"]/value')[0];
echo "Value=".$value.PHP_EOL;

虽然注意$ value仍然是SimpleXMLElement对象,所以如果你需要它作为字符串,你应该使用(string)$value。在示例中,echo会自动为您执行转换。