这是我的问题:
我有一个带有这个模式的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>
)。
希望我足够清楚。感谢任何帮助,谢谢!
答案 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']
返回所有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 ) )