【问题标题】:Searching and printing XML using XPath使用 XPath 搜索和打印 XML
【发布时间】:2012-02-01 13:16:11
【问题描述】:

我正在搜索一个如下所示的 xml 文件:

<producers>
  <producer>
    <name></name>
    <owner></owner>
    <phone></phone>
    <fax></fax>
    <overview></overview>
    <address>
      <civic></civic>
      <mailing></mailing>
      <town></town>
      <province></province>
      <postal></postal>
      <email></email>
      <website></website>
    </address>
    <products>
      <product>Salmon</product>
      <product>Trout</product>
    </products>
    <exports>
      <region>Canada</region>
      <region>United States</region>
    </exports>
  </producer>

然后我像这样搜索它:

$upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÂÆÇÈÉÊËÎÏÔŒÙÛÜ"; 
$lower = "abcdefghijklmnopqrstuvwxyzàâæçèéêëîïôœùûü";

$region = "Canada";

$node = $xml->xpath('//producers/producer/exports[descendant::*[contains(translate(text(), "'.$upper.'", "'.$lower.'"), "'.$region.'")]]');

问题是我希望能够打印整个生产者。但此时我所能访问的只是出口的任何后代中包含的内容。有没有办法可以返回几个节点来检索所需生产者的完整列表?

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

    我认为您只需将 /../../ 放在 xpath 的末尾即可。像这样的

    $node = $xml->xpath('//producers/producer/exports[descendant::*[contains(translate(text(), "'.$upper.'", "'.$lower.'"), "'.$region.'")]]/../../');
    

    【讨论】:

    • 这符合我需要做的。谢谢!
    【解决方案2】:

    你可以使用这个 XPath,它更具可读性:

    $node = $xml->xpath('//producers/producer[exports/region[contains(translate(text(), "'.$upper.'", "'.$lower.'"), "'.$region.'")]]');
    

    它将选择所需的producer

    【讨论】:

    • 这看起来确实更干净,但不幸的是,我正在使用一个 xpath 语句进行几种不同类型的搜索。但这确实有助于我更好地理解这一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多