我有一个合并的xml与一个根元素和多个项子元素.像这样的东西
<root>
<item>test1</item>
<item>test2</item>
</root>
Run Code Online (Sandbox Code Playgroud)
我想要的是一种简单的方法来解析xml并从项目中创建一个xml字符串数组.
$arrXml[0] = '<item>test1</item>';
$arrXml[1] = '<item>test2</item>';
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个优雅的解决方案而不是任何解决方案.
好的,就像你在问题的评论中已经提到的那样,我不相信这是你应该做的,但是因为我不能忍受SimpleXml并且不希望人们认为这是唯一的方法,这里是如何做到的
用DOM:
$arrXml = array();
$dom = new DOMDocument;
$dom->loadXML( $xml );
foreach( $dom->getElementsByTagName( 'item' ) as $item ) {
$arrXml[] = $dom->saveXML( $item );
}
print_r( $arrXml );
Run Code Online (Sandbox Code Playgroud)
用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 );
Run Code Online (Sandbox Code Playgroud)
并且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);
Run Code Online (Sandbox Code Playgroud)
*这也可以通过遇到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 );
Run Code Online (Sandbox Code Playgroud)
或正则表达式(以下阅读免责声明)
preg_match_all('#<item>.*</item>#', $xml, $arrXml);
print_r($arrXml[0]);
Run Code Online (Sandbox Code Playgroud)
免责声明现在,只是为了确保您没有开始定期使用Regex或Explode解析XML:最后两种方法只有在您显示标记时才能明确定义.