使用PHP从XML获取数据(但非常具体约束)

时间:2015-10-30 15:50:25

标签: php xml

这是我的问题:

我有一个带有这个模式的XML文件:

<doc_xml>
  <ad>
     <ref>123456</ref>
     <date>20150101</date>
     <title>My first child title</title>
  </ad>
  <ad>
     <ref>897510</ref>
     <date>20170211</date>
     <title>My second child title</title>
  </ad>
</doc_xml>

我想做的是获取其中一个孩子的所有数据。广告&gt;但仅限于&lt;参考&gt; value是(例如)= 123456,所以在这种情况下,只使用我的请求获取此数据列表:

$ref = 123456;
$date = 123456;
$title = 'My first child title';

目前,我在PHP中使用此代码:

xml=simplexml_load_file("file.xml") or die("Error: Cannot create object");
$ref = '123456';
$data = $xml->xpath("/doc_xml/ad/ref[contains(., '$ref')]
");
print_r($data);

这让我得到这个数组:

Array ( [0] => SimpleXMLElement Object ( [0] => 123456 ) )

但我无法找到如何获得另一个孩子的价值(在同一级别,<date><title>)。

希望我足够清楚。感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:2)

Xpath中的条件可以在任何位置复杂得多。

contains()看起来不对 - 例如123456包含234。我建议使用normalize-space()和等于。

您有两种可能的解决方案:

获取具有特定ad

ref元素

返回ad元素:
/doc_xml/ad

...带有ref子元素:
/doc_xml/ad[ref]

......等于特定文字:
/doc_xml/ad[normalize-space(ref) = '123456']

将Xpath与ref节点一起用作上下文

返回所有ad元素:
/doc_xml/ad/ref[normalize-space(.) = '123456']

将找到的ref元素作为上下文,获取同级title

../title

或:

parent::*/title

在SimpleXML中使用节点作为上下文意味着您在该节点上调用方法xpath()。在DOM中,您将其作为DOMXpath::evaluate()的第二个参数提供。

答案 1 :(得分:1)

$data = $xml->xpath("/doc_xml/ad/ref[contains(., '$ref')]/parent::*");
print_r($data);

找到孩子并将xpath移至该孩子的parent。因此,您将获得如下数据数组

Array ( [0] => SimpleXMLElement Object ( [ref] => 123456 [date] => 20150101 [title] => My first child title ) )