上周我问了一个类似的问题,但没有得到真正指出它的答案。我怀疑这个问题需要更明确地说明,所以这里有:
鉴于此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上的任何人是否知道这种方式是什么(或者可以告诉我,实际上,这不是一种更简单的方法)。提前谢谢。
答案 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: