使用PHP,如何从XML文档中获取整个节点子集?我可以检索如下内容:
<?xml version="1.0" encoding="utf-8"?>
<people>
<certain>
<name>Jane Doe</name>
<age>21</age>
</certain>
<certain>
<certain>
<name>John Smith</name>
<age>34</age>
</certain>
</people>
但是如果我只想返回像这样的子节点呢?
<certain>
<name>Jane Doe</name>
<age>21</age>
</certain>
<certain>
<certain>
<name>John Smith</name>
<age>34</age>
</certain>
编辑:我正在尝试获取XML的一个子集并直接传递,而不是像simplexml这样的对象会给我。我基本上试图让PHP去做.NET的OuterXml做的事情......按字面意思返回上面的XML子集......没有解释或转换或创建新的XML文件或任何东西......只需原地提取这些节点并传递他们。我是否必须获取XML文件,解析我需要的内容然后将其重建为新的XML文件?如果是这样,我需要摆脱<?xml version="1.0" encoding="utf-8"?>
位......呃。
答案 0 :(得分:2)
您可以使用DOMDocument.GetElementsByTagName
,也可以:
使用XPath?
<?php
$xml = simplexml_load_file("test.xml");
$result = $xml->xpath("//certain");
print_r($result);
?>
答案 1 :(得分:2)
答案是使用XPath。
$people = simplexml_load_string(
'<?xml version="1.0" encoding="utf-8"?>
<people>
<certain>
<name>Jane Doe</name>
<age>21</age>
</certain>
<certain>
<name>John Smith</name>
<age>34</age>
</certain>
</people>'
);
// get all <certain/> nodes
$people->xpath('//certain');
// get all <certain/> nodes whose <name/> is "John Smith"
print_r($people->xpath('//certain[name = "John Smith"]'));
// get all <certain/> nodes whose <age/> child's value is greater than 21
print_r($people->xpath('//certain[age > 21]'));
所以显然你想将一些节点从一个文件复制到另一个文件中? SimpleXML不支持这一点。 DOM有方法,但使用起来很烦人。你在用哪一个?这是我使用的:SimpleDOM。事实上,它实际上是用DOM的方法增强的SimpleXML。
include 'SimpleDOM.php';
$results = simpledom_load_string('<results/>');
foreach ($people->xpath('//certain') as $certain)
{
$results->appendChild($certain);
}
该例程通过XPath查找所有<certain/>
节点,然后将它们附加到新文档。
答案 2 :(得分:2)
使用DOM和XPath。 Xpath允许您从XML DOM中选择节点(和值)。
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
$result = '';
foreach ($xpath->evaluate('/people/certain') as $node) {
$result .= $dom->saveXml($node);
}
echo $result;
DOMDocument :: saveXml()有一个context参数。如果提供,它将该节点保存为XML。很像outerXml()
。 PHP也可以为DOM节点注册自己的类。因此,甚至可以向元素节点添加outerXML()
函数。
class MyDomElement extends DOMElement {
public function outerXml() {
return $this->ownerDocument->saveXml($this);
}
}
class MyDomDocument extends DOMDocument {
public function __construct($version = '1.0', $encoding = 'utf-8') {
parent::__construct($version, $encoding);
$this->registerNodeClass('DOMElement', 'MyDomElement');
}
}
$dom = new MyDomDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
$result = '';
foreach ($xpath->evaluate('/people/certain') as $node) {
$result .= $node->outerXml();
}
echo $result;
答案 3 :(得分:1)
答案 4 :(得分:1)
答案结果是xpath建议和输出asXML()
的组合。
使用Josh Davis给出的例子:
$people = simplexml_load_string(
<?xml version="1.0" encoding="utf-8"?>
<people>
<certain>
<name>Jane Doe</name>
<age>21</age>
</certain>
<certain>
<name>John Smith</name>
<age>34</age>
</certain>
</people>'
);
// get all <certain/> nodes
$nodes = $people->xpath('/people/certain');
foreach ( $nodes as $node ) {
$result .= $node->asXML()."\n";
}
echo $result;