使用PHP检索XML节点的子集

时间:2009-12-10 17:03:49

标签: php xml simplexml

使用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"?>位......呃。

5 个答案:

答案 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]'));

拿2

所以显然你想将一些节点从一个文件复制到另一个文件中? 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;

演示:https://eval.in/162149

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;

演示:https://eval.in/162157

答案 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;