好的,就像在您的问题评论中已经提到的那样,我不认为这是您应该做的,但由于我不能忍受SimpleXml并且不希望人们认为这是唯一的方法,下面是如何使用DOM
实现:
:
$arrXml = array();
$dom = new DOMDocument;
$dom->loadXML( $xml );
foreach( $dom->getElementsByTagName( 'item' ) as $item ) {
$arrXml[] = $dom->saveXML( $item );
}
print_r( $arrXml );
使用 XMLReader
:
$arrXml = array();
$reader = new XmlReader;
$reader->xml( $xml );
while( $reader->read() ) {
if( $reader->localName === 'item' && $reader->nodeType === 1 ) {
$arrXml[] = $reader->readOuterXml();
}
}
print_r( $arrXml );
并且 XMLParser*
:
xml_parse_into_struct(xml_parser_create(), $xml, $nodes);
$xmlArr = array();
foreach($nodes as $node) {
if($node['tag'] === 'ITEM') {
$arrXml[] = "<item>{$node['value']}</item>";
}
}
print_r($arrXml);
*也可以通过在遇到ITEM元素时触发回调来完成此操作。需要更多的代码,但非常灵活。
请注意,以上所有内容可能需要根据您实际的XML进行一些微调。
考虑到您问题中的XML(很可能只是一个示例)非常简单且定义良好,您还可以使用explode()
:
$arrXml = array_map( 'trim',
array_filter(
explode( PHP_EOL, $xml ),
function( $line ) { return substr( $line, 0, 6 ) === '<item>'; }
));
print_r( $arrXml );
或者使用正则表达式(请阅读免责声明)。
preg_match_all('#<item>.*</item>#', $xml, $arrXml);
print_r($arrXml[0]);
免责声明 现在,只是为了确保您不会经常使用正则表达式或分解来解析XML:只有当您的标记确实像您展示的那样明确定义时,最后两种方法才可行。