如何使用命名空间加载xml数据

时间:2018-03-02 19:45:37

标签: php xml

所以我试图加载的XML看起来像这样:

<tns:PersonListOutput xmlns:tns="http://www.example.com/api/person">
  <tns:LastName>Doe</tns:LastName>
  <tns:TransmissionDate>2018-03-02T10:16:23</tns:TransmissionDate>
  <tns:People>
    <tns:Person>
      <tns:Name>John Doe</tns:Name>
      <tns:RevisionDate>2017-08-10T01:45:40</tns:RevisionDate>
    </tns:Person>
    <tns:Person>
      <tns:Name>Jane Doe</tns:Name>
      <tns:RevisionDate>2017-08-10T01:45:43</tns:RevisionDate>
    </tns:Person>
  </tns:People>
</tns:PersonListOutput>

我使用以下代码从URL加载此数据:

$response_xml_data = file_get_contents($URL);
$data = simplexml_load_string($response_xml_data);

我终于能够引用顶级属性但无法获取Person的属性。如果有人可以帮助访问Person或建议更好的方法,那么我就是这样工作的最终方式。

$data->registerXPathNamespace('tns', 'http://www.example.com/api/person');
$LastName = $data->xpath('//tns:LastName ');
$TransmissionDate = $data->xpath('//tns:TransmissionDate');

echo $LastName[0];
echo "<br/>";
echo $TransmissionDate[0];

1 个答案:

答案 0 :(得分:1)

您需要将命名空间保留在XPath查询元素之前,如下所示:

//tns:People/tns:Person/tns:Name

这将为NamePerson内的所有People元素提供内容。

$data = simplexml_load_string($response_xml_data);
$data->registerXPathNamespace('tns', 'http://www.example.com/api/person');
$LastName = $data->xpath('//tns:LastName ');
$TransmissionDate = $data->xpath('//tns:TransmissionDate');
$people = $data->xpath('//tns:People/tns:Person/tns:Name');
var_dump($people);

Demo

结果

array (size=2)
  0 => 
    object(SimpleXMLElement)[4]
      public 0 => string 'John Doe' (length=8)
  1 => 
    object(SimpleXMLElement)[5]
      public 0 => string 'Jane Doe' (length=8)