【问题标题】:How do I parse this XML with xpath to get to an element directly? [duplicate]如何使用 xpath 解析此 XML 以直接获取元素? [复制]
【发布时间】:2012-10-07 03:11:46
【问题描述】:

可能重复:
Parse XML with Namespace using SimpleXML

我是 xpath 的新手,无法解析它。它不产生任何输出。

这包含从 Google Map API V3 返回的 XML。我想让它解析并从 PostalCode/PostalCodeNumber 返回邮政编码。我设置了这个测试,因为我需要能够确保我可以访问 PostalCode/PostalCodeNumber,即使 Google 的 API 设置了其他标签,有时也会这样做。所以让 xpath 工作对我来说很重要,因为我希望能够直接访问 PostalCode/PostalCodeNumber 等内容,而不依赖于静态树结构路径。请善意和帮助您的回复,谢谢!

<?php

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<kml xmlns="http://earth.google.com/kml/2.0"><Response>
  <name>40.74445606,-73.97495072</name>
  <Status>
    <code>200</code>
    <request>geocode</request>
  </Status>
  <Placemark id="p1">
    <address>317 E 34th St, New York, NY 10016, USA</address>
    <AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>US</CountryNameCode><CountryName>USA</CountryName><AdministrativeArea><AdministrativeAreaName>NY</AdministrativeAreaName><Locality><LocalityName>New York</LocalityName><Thoroughfare><ThoroughfareName>317 E 34th St</ThoroughfareName></Thoroughfare><PostalCode><PostalCodeNumber>10016</PostalCodeNumber></PostalCode></Locality></AdministrativeArea></Country></AddressDetails>
    <ExtendedData>
      <LatLonBox north="40.7458050" south="40.7431070" east="-73.9736017" west="-73.9762997" />
    </ExtendedData>
    <Point><coordinates>-73.9749507,40.7444560,0</coordinates></Point>
  </Placemark>
</Response></kml>
XML;

$xml = new SimpleXMLElement($xml);

$result = $xml->xpath('PostalCode/PostalCodeNumber');

while(list( , $node) = each($result)) {
    echo 'PostalCode/PostalCodeNumber: ',$node,"\n";
}
?>

【问题讨论】:

  • 我的第一个冲动是怀疑您的 ?> 正在杀死您的字符串...您是否确认那里有有效的 XML?
  • 是的,我已经做了一个 var_dump($xml) 并且看起来不错。您可以插入 var_dump($xml);进去看看。
  • 我真的可以在这里使用正确语法的帮助,其他帖子没有解决我遇到问题的方法。谢谢!
  • @Edward:cmets 已经存在,他移除它们的机会非常渺茫。 :) 如果您觉得它们令人反感,请标记它们。但它们的内容似乎基本上是正确的。 XML 关心名称空间——例如,此文档的(urn:oasis:names:tc:ciq:xsdschema:xAL:2.0)PostalCode 和您的PostalCode 不匹配。您需要指定一个命名空间,而另一个问题的最高投票答案涵盖了如何做到这一点。
  • 可以,当然,取而代之的是JSON格式的数据,那么提取你需要的数据会更容易。

标签: php xpath


【解决方案1】:

使用descendant::PostalCode//PostalCode

请注意,在上面的链接中,我从您的 xml 中删除了命名空间定义以使其正常工作。 查看http://www.edankert.com/defaultnamespaces.html#Conclusion 以获得清晰的解释。

See W3Schools for an easy to understand XPath introduction.

【讨论】:

  • 感谢您的回复。我也不知道什么是 XML 测试器,所以这很酷!
【解决方案2】:

邮政编码位于命名空间中。您必须在 XPath 表达式中指定命名空间以匹配元素:

$xml = new SimpleXMLElement($xml);
$xml->registerXPathNamespace('urn', 'urn:oasis:names:tc:ciq:xsdschema:xAL:2.0');
$result = $xml->xpath('//urn:PostalCodeNumber');

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
相关资源
最近更新 更多