猿问

PHP解析XML?

我用PHP解析 bpmn生成的XML文件,但是生成的XML文件很复杂,解析出来的有数据丢失

$xmlfile = 'test.xml';
$xmlparser = xml_parser_create();

// 打开文件并读取数据
$fp = fopen($xmlfile, 'r');
$xmldata = fread($fp, 4096);

xml_parse_into_struct($xmlparser,$xmldata,$values);

xml_parser_free($xmlparser);
echo json_encode($values);

有数据丢失


也用了递归的方式解析,也有丢失

/对xml文件进行解析
function get_xml_file($filename = 'test.xml'){
   //首先要建一个DOMDocument对象
   $domObject = new DOMDocument();
   //加载test.xml文件
   $domObject->load($filename);
   //返回xml文件的根节点
   $rootObject = $domObject->documentElement;
   //根据跟节点取到xml的结构返回一个数组;
   $array = get_node_array($rootObject);
   //返回xml结构,类型为数组
   return $array;
}
//返回一个xml节点的所以子元素
function get_node_array($node)
{

   //定义数组返回这个xml的结构
   $array = array();
   //判断根节点是否还有属性
   if($node->hasAttributes())
   {
       foreach($node->attributes as $attrabute)
       {
           $array[$attrabute->nodeName]=$attrabute->nodeValue;
       }
   }

   //如果根节点还有子节点
   if($node->hasChildNodes())
   {
       //取到根节点的所有子节点,返回一数组
       $child_array = $node->childNodes;
       //如果只用一个子节点

       if($child_array->length == 1)
       {
           $array[$node->firstChild->nodeName]=$node->firstChild->nodeValue;
       }else
       {
           //开始遍历子节点
           foreach($child_array as $child_item)
           {
               //如果这个节点不是文本节点的话,递归进行遍历
               if($child_item->nodeType != XML_TEXT_NODE)
               {
                   $array[$child_item->nodeName][] = get_node_array($child_item);
               }
           }
       }
   }else
   {
       return $node->nodeValue;
   }
   return $array;
}
print_r(json_encode(get_xml_file('test.xml')));


实在忍不住了
浏览 1212回答 1
1回答

512205584

用simplexml
随时随地看视频慕课网APP
我要回答