php解析xml字符串[重复]

Posted

技术标签:

【中文标题】php解析xml字符串[重复]【英文标题】:php parse xml string [duplicate] 【发布时间】:2011-04-07 13:10:24 【问题描述】:

可能重复:Best XML Parser for php

我有一个包含 XML 数据的字符串。如何在 PHP 中解析它?

谢谢

【问题讨论】:

【参考方案1】:

如果您熟悉 Zend 框架,请将您的 XML 传递给 Zend_Config_Xml

像这样给定xml

$myXml = '
<?xml version="1.0" ?>
<top>
  <var>value</var>
  <nested>
    <var>value</var>
  </nested>
  <arrayVar>
    <item>1</item>
    <item>2</item>
    <item>3</item>        
  </arrayVar>
</top>';

你可以这样访问它:

$xml = new Zend_Config_Xml( $myXml );

$var = $xml->var;
$nestedVar = $xml->nested->var;
$arrayVar = $xml->arrayVar->toArray();

Zend Config XML 使用 simplexml 并在此基础上构建以提供一个漂亮的界面,这使得访问您正在寻找的 xml 节点变得非常容易。

ZF 手册中有更多内容,包括如何访问属性以及其他一些非常有用的功能。

http://framework.zend.com/manual/en/zend.config.adapters.xml.html

Zend Config 是 ZF 中最容易使用的部分之一,而且(我认为)它是一个独立的组件,您可以只使用 Zend Config 而不能使用 ZF 的其他部分

【讨论】:

【参考方案2】:

对于那些 SimpleXML 不可用的情况,我使用了这个函数,这个函数最初发表在 php.net 上的评论中。它在 99% 的时间里都很好用。

<?php
/**
 * Convert XML to an Array
 *
 * @param string  $XML
 * @return array
 */
function XMLtoArray($XML)

    $xml_parser = xml_parser_create();
    xml_parse_into_struct($xml_parser, $XML, $vals);
    xml_parser_free($xml_parser);
    // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
    $_tmp='';
    foreach ($vals as $xml_elem) 
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_level!=1 && $x_type == 'close') 
            if (isset($multi_key[$x_tag][$x_level]))
                $multi_key[$x_tag][$x_level]=1;
            else
                $multi_key[$x_tag][$x_level]=0;
        
        if ($x_level!=1 && $x_type == 'complete') 
            if ($_tmp==$x_tag)
                $multi_key[$x_tag][$x_level]=1;
            $_tmp=$x_tag;
        
    
    // jedziemy po tablicy
    foreach ($vals as $xml_elem) 
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_type == 'open')
            $level[$x_level] = $x_tag;
        $start_level = 1;
        $php_stmt = '$xml_array';
        if ($x_type=='close' && $x_level!=1)
            $multi_key[$x_tag][$x_level]++;
        while ($start_level < $x_level) 
            $php_stmt .= '[$level['.$start_level.']]';
            if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level])
                $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
            $start_level++;
        
        $add='';
        if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete')) 
            if (!isset($multi_key2[$x_tag][$x_level]))
                $multi_key2[$x_tag][$x_level]=0;
            else
                $multi_key2[$x_tag][$x_level]++;
            $add='['.$multi_key2[$x_tag][$x_level].']';
        
        if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem)) 
            if ($x_type == 'open')
                $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
            else
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
            eval($php_stmt_main);
        
        if (array_key_exists('attributes', $xml_elem)) 
            if (isset($xml_elem['value'])) 
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
                eval($php_stmt_main);
            
            foreach ($xml_elem['attributes'] as $key=>$value) 
                $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
                eval($php_stmt_att);
            
        
    
    return $xml_array;

?>

【讨论】:

【参考方案3】:

试试simple XML,这是一个例子:

do.php:

<?php
$xml_str = file_get_contents('xmlfile.xml');
$xml = new SimpleXMLElement($xml_str);
$items = $xml->xpath('*/item');

foreach($items as $item) 
    echo $item['title'], ': ', $item['description'], "\n";

xmlfile.xml:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
    <items>
        <item title="Hello World" description="Hellowing the world.." />
        <item title="Hello People" description="greeting people.." />
    </items>
</xml>

【讨论】:

以上是关于php解析xml字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

php 如何解析xml格式字符串

如何在Java(Android)中解析包含XML的字符串[重复]

java将字符串转换为xml并解析节点[重复]

php 输出 xml 产生解析错误“'”

PHP - xml 到 json 的转换:“字符串无法解析为 XML”

使用非法特殊字符 (&) 解析 XML [重复]