【问题标题】:Split XML in PHP在 PHP 中拆分 XML
【发布时间】:2011-08-03 18:09:07
【问题描述】:

我有一个包含一个根元素和多个项目子元素的合并 xml。 像这样的

 <root>
  <item>test1</item>
  <item>test2</item>
 </root>

我想要的是一种简单的方法来解析 xml 并从项目中创建一个 xml 字符串数组。

$arrXml[0] = '<item>test1</item>';
$arrXml[1] = '<item>test2</item>';

我正在寻找一个优雅的解决方案,而不是任何解决方案。

【问题讨论】:

  • 我不明白这有什么关系?对于这个特殊的解决方案,我有一个特殊的任务。我不认为大局可以改变。我相信我对要求已经足够清楚了。
  • @user 这听起来像是一个非常愚蠢的想法。
  • 即使你有开发经验,我也不敢相信你因为没有分享更大的图景而投票反对我。我要求的很清楚,我不需要道德课。此外,如果您真的需要知道第 3 方正在发送一个大的 xml 文件。我需要解析文件并将每个客户端所需的部分也作为 xml 发送。
  • 元素会在同一行开始和结束吗?另外,从您的大局来看,我会说这种方法最好用 XSLT 解决,或者至少不用转换为数组。我的意思是,如果您需要发回 XML,为什么要转换为数组?只需选择您需要的零件并发送。顺便说一句,好佩卡问。

标签: php xml


【解决方案1】:

好的,就像你的问题在 cmets 中已经提到的那样我不相信这真的是你应该做的,但是因为我不能忍受 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]);

免责声明现在,只是为了确保您没有开始定期使用 Regex 或 Explode 解析 XML:最后两种方法只有在您的标记确实像您这样明确定义时才可行显示出来。

【讨论】:

  • 你没有提到 SimpleXmlElement,它可以到 xpath 查找。但根据我的经验,它的 asXml() 方法不能很好地处理命名空间。
【解决方案2】:

SimpleXml manual page 的 cmets 中有一些不错的代码示例。 我相信你可以从objectsIntoArray() 样本中做一些事情。

【讨论】:

    【解决方案3】:

    你看过SimpleXML吗?

    例如:

    $string = "
     <root>
      <item>test1</item>
      <item>test2</item>
     </root>
    ";
    
    $xml = simplexml_load_string($string);
    

    【讨论】:

    • 这不会满足他的要求。也就是说,我不确定他的要求是否是个好主意
    • @Pekka - 是的,我知道,但他想要一个优雅的解决方案来解析 XML,simpleXML 就是这样(imo)。否则误差太大
    • 这是第一步,我同意..但剩下的呢?
    猜你喜欢
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多