【问题标题】:Using Xpath to get Data from XML with Namespace使用 Xpath 从带有命名空间的 XML 中获取数据
【发布时间】:2011-09-13 18:38:15
【问题描述】:

我一直在用这个头撞砖墙,所以非常感谢一些帮助。我是第一次使用 xpath,它可以毫无问题地完成大部分我需要的事情。

这里是一个例子 sn-p:

 $urlw = "http://www.wahanda.com/rss/mobdeal.xml";
 $wf = gzopen ($urlw, 'r');
 $wxml = new SimpleXMLElement (fread ($wf, 1000000));

 foreach($wxml->xpath ('/rss/channel/item') as $entry) 
 {
    $price = $entry->price;
    echo $price . "<br/>"; 
 }

我的问题是我当前使用的提要具有命名空间声明,因此“价格”节点实际上是“w:price”。我想使用的一些节点以“w:”为前缀,而其他节点则没有。因此,我的代码无法获取前缀节点的内容。有人可以告诉我如何解决这个问题吗?通过阅读,我添加了以下内容:

 $wxml->registerXPathNamespace('w', 'http://www.wahanda.com/ns/1.0');

但仍然不确定从这里开始我需要做什么。

非常感谢您的帮助。

【问题讨论】:

  • 注册前缀后,可以query nodes with that prefix,例如: w:foo/w:bar 与 xpath() method。请澄清问题。
  • 嗨@Gordon - 我正在努力找出我需要替换的东西 $price = $entry->price;在我上面的代码中,为我提供 XML 中每个“项目”的单独 w:price 值。我按照下面的建议使用了 $price = $wxml->xpath ('//w:price') 但这会返回一个数组 - 假设每个“项目”中只有一个“w:price”节点,我认为它会起作用。 ..
  • 在这种情况下,您必须使用children()。有关类似问题,请参阅 PHP SimpleXML Namespace Problem。
  • @Gordon - 非常感谢。我现在使用 $price = $entry->children('w', true)->price;这样就成功了!

标签: php xml xpath namespaces


【解决方案1】:

你在正确的轨道上。您需要做的就是使用命名空间编写一个 xpath 查询。比如:

$wxml->xpath ('//w:price')

【讨论】:

  • 谢谢@datasage。当我替换 $price = $entry->price; with $price = $wxml->xpath ('//w:price');在上面的代码中,我得到的输出是“Array”。然而,每个“项目”中只有一个“w:price”节点,所以我认为它应该每次都选择一个单独的价格,而不是一个数组?
猜你喜欢
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2014-06-05
  • 1970-01-01
相关资源
最近更新 更多