PHP - 从更大的XML文档中提取一大块XML

时间:2009-12-15 16:16:37

标签: php xml

上周我问了一个类似的问题,但没有得到真正指出它的答案。我怀疑这个问题需要更明确地说明,所以这里有:

鉴于此XML:

<?xml version="1.0" encoding="utf-8"?>
<everyone>
  <guest>
    <name>Joseph Needham</name>
    <age>53</age>
  </guest>
  <guest>
    <name>Lu Gwei-djen</name>
    <age>31</age>
  </guest>
</everyone>

我如何准确地回复:

  <guest>
    <name>Joseph Needham</name>
    <age>53</age>
  </guest>
  <guest>
    <name>Lu Gwei-djen</name>
    <age>31</age>
  </guest>

我不想要一个simplexml对象,我不想转换任何东西,我不想只是节点的值,我不想要一个带有相应标题的新XML文档......只是大块的XML。无法使用外部库......没有标准的PHP平均安装。如何从另一个中提取一个?

我最好的猜测?使用DomDocument以某种方式获取节点名称和内容,然后使用foreach循环重新构建我想要的内容,并回显各种节点名称和值,包括行结尾,以正确格式化所有内容。然而,这似乎令人惊讶地笨重。我怀疑有一种更简单的方法可以做到这一点,所以我想看看stackoverflow上的任何人是否知道这种方式是什么(或者可以告诉我,实际上,这不是一种更简单的方法)。提前谢谢。

5 个答案:

答案 0 :(得分:2)

$reader = new XMLReader();
$reader->xml($xml_str);
$reader->read();
$inner = $reader->readInnerXML();

// $inner is your desired xml string.

使用XMLReader的一个优点是它使用的内存比SimpleXML或DOM类少。另一个是它非常快。

答案 1 :(得分:2)

$string = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<everyone>
  <guest>
    <name>Joseph Needham</name>
    <age>53</age>
  </guest>
  <guest>
    <name>Lu Gwei-djen</name>
    <age>31</age>
  </guest>
</everyone>

XML;

$xml = new SimpleXMLElement($string);
$nodes = $xml->xpath('/everyone/guest');

$result = '';
foreach ( $nodes as $node ) {
  $result .= $node->asXML()."\n";
}
echo $result;
die;

答案 2 :(得分:2)

像这样的事情(使用XPath - 如果你有另一种方法来获取客人元素的列表,你可以使用它)应该这样做。

$xml = '';
$xpath = new DOMXPath($document);
foreach($xpath->query('//everyone/guest') as $guestNode) {
    $xml .= $document->saveXML($guestNode);
}

答案 3 :(得分:1)

preg_match('`<guest>.*</guest>`is', $xml, $matches);
print_r($matches);

答案 4 :(得分:0)

请参见清单5: