【问题标题】:SimpleXML: Get Child of Parent with Specific AttributeSimpleXML:获取具有特定属性的父级的子级
【发布时间】:2014-04-09 20:54:56
【问题描述】:

我正在尝试仅提取“US”的 PageViews %,但在为其设置 xpath 时遇到问题。有什么想法吗?

<aws:TrafficData>
<aws:DataUrl type="canonical">jobdiagnosis.com/</aws:DataUrl>
<aws:RankByCountry>
  <aws:Country Code="IN">
    <aws:Rank>54968</aws:Rank>
    <aws:Contribution>
      <aws:PageViews>0.46%</aws:PageViews>
      <aws:Users>0.46%</aws:Users>
    </aws:Contribution>
  </aws:Country>
  <aws:Country Code="US">
    <aws:Rank>703</aws:Rank>
    <aws:Contribution>
      <aws:PageViews>78.11%</aws:PageViews>
      <aws:Users>77.39%</aws:Users>
    </aws:Contribution>
  </aws:Country>
</aws:RankByCountry>

xpath('//Country[Code="US"]//PageViews')

【问题讨论】:

  • 您的 xpath 仅适用于默认命名空间,但是,元素名称前面的 aws: 显示,您要查找的元素 not 在默认命名空间。因此,您的 xpath 查询不会返回任何内容。

标签: php xml simplexml xml-namespaces


【解决方案1】:

文档中的所有元素都在某个命名空间中,因此您需要为该命名空间 URI 注册一个前缀,并在您引用元素名称的 XPath 表达式的每个步骤中使用该前缀。注册的前缀不必与文档中使用的前缀匹配,但命名空间 URI 必须匹配。

假设您已将 XML 读入变量 $xml

$xml->registerXPathNamespace("aws", "http://that.namespace.uri");
$pageviews = $xml->xpath('//aws:Country[@Code="US"]/*/aws:PageViews');

【讨论】:

    【解决方案2】:

    试试这个:

    xpath('//Country[Code="US"]//PageViews')
    

    而不是这个:

    xpath('//Country[Code="US"]//PageView')
    

    更新

    试试这个:

    xpath('/Country[@Code="US"]/PageViews']
    

    【讨论】:

    • 我刚刚在我的帖子中发现了这一点,这只是一个错字。 PageViews 仍然返回一个空数组。不过还是谢谢。
    • 仍然得到一个空数组。
    【解决方案3】:

    注意命名空间(aws):

    $pageviews = $xml->xpath('//aws:Country[@Code="US"]/Contribution/PageViews');
    

    或使用http://www.php.net/manual/en/simplexmlelement.registerxpathnamespace.php

    【讨论】:

      【解决方案4】:

      感谢大家的帮助,但我仍然无法使用 xpath 让它工作。决定诉诸循环遍历“按国家/地区排名”数组,直到找到“美国”。不理想,但它会满足我的需要。再次感谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-03
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多