php如何解析多级xml报文?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php如何解析多级xml报文?相关的知识,希望对你有一定的参考价值。

接口的回执报文 通过 simplexml_load_string 和 loadXML 试了下,只能遍历到第一层,第二层是个string ,想把INFO2里的数据遍历到数据库里。

在该示例中,simplexml_load_file 函数用于加载 XML 文件并将其作为 SimpleXMLElement 对象返回。然后,我们可以使用 children() 方法访问根节点的所有子节点,并使用 getName() 方法获取每个子节点的名称。接下来,我们可以继续使用 children() 方法访问每个子节点的所有子节点,以此类推,直到达到所需的级别。

参考技术A 看了一下xml结构,感觉该代码不是完整版,看到你用 simplexml_load_string 和 loadXML来解析,这2个肯定解析,但是不推荐,如果xml结构多且复杂解析效率会很低,推荐用xml_parser_create实现,这个效率要快很多。
根据你贴的 xml,发现是xml里嵌套xml,我的思路是先解析出第一层的xml数据集,第一次层的xml数据集其实也就是你待解析的xml,采用循环逐个再次解析即可得到你想要的数据了,贴上我在其他项目中用xml_parser_create的代码供你参考。
private function parseXml($xml, $fileName)

$p = xml_parser_create();
xml_parse_into_struct($p, $xml, $vals, $index);
xml_parser_free($p);
$cnt = count($index['URL']);
$xmlData = [];
for ($i = 0; $i < $cnt; $i++)
$data = [];
$data['url'] = $vals[$index['URL'][$i]]['value'];
$data['title'] = $vals[$index['TITLE'][$i]]['value'];
$data['file'] = $fileName;
$xmlData[] = $data;

return $xmlData;
追问

您好,xml_parser_create 我后来也用过,主要还是因为xml中包含的这个cdata 有很多非法的xml字符,比如 ' " & ) (] [ 之类的,所以目前的做法是 替换 ...,单至少能用,我用java 就方便很多,parseText 后 再 getRootElement 就能解析到我最终想要的。只不过环境的问题,我要用到php 。不知道是否有php版本针对 文本解析方法?

参考技术B 在PHP中,解析多级XML报文可以使用DOM解析器或SimpleXML解析器来实现。以下是使用SimpleXML解析器的一个示例:
假设我们有一个多级XML报文如下:
xmlCopy code<?xml version="1.0" encoding="UTF-8"?><books>
<book>
<title>PHP and XML</title>
<author>Jack Herrington</author>
<publisher>O'Reilly</publisher>
<price>39.99</price>
</book>
<book>
<title>Web Services Essentials</title>
<author>Ethan Cerami</author>
<publisher>O'Reilly</publisher>
<price>29.99</price>
</book></books>

要解析这个XML报文,可以使用SimpleXML解析器的loadFile()或loadString()方法将XML数据加载到一个SimpleXMLElement对象中,然后使用该对象的属性或方法来获取或修改XML数据。
以下是一个使用SimpleXML解析器解析上述XML报文的示例代码:
phpCopy code$xml = simplexml_load_file("books.xml");foreach ($xml->book as $book) echo "Title: " . $book->title . "<br>"; echo "Author: " . $book->author . "<br>"; echo "Publisher: " . $book->publisher . "<br>"; echo "Price: $" . $book->price . "<br>"; echo "<br>";


在这个示例中,我们首先使用simplexml_load_file()方法将XML文件加载到一个SimpleXMLElement对象中,然后使用foreach循环遍历每个book节点,并输出其中的title、author、publisher和price子节点的值。通过这种方式,我们可以很方便地解析多级XML报文。如果XML报文更加复杂,可以使用XPath表达式来进行高级查询和筛选。
参考技术C 完成

1、使用simplexml_load_string()函数,将xml报文转换为simplexml对象;

2、使用foreach循环遍历simplexml对象,获取每一个节点的属性和值;

3、使用array_merge()函数,将多级xml报文转换为一维数组;

4、使用json_encode()函数,将一维数组转换为json格式,以便于前端解析。

PHP通过XML报文方式,已第三方接口交互(发送xml,获取XML,并解析xml步骤)

  

 

开发者端:发送请求,并接收结果

<?php

//  下面的demo,实现的功能如下:
//   1-开发者需要判断一个用户是否存在,去请求第三方接口。
//   2-与第三方接口的通信,是以xml格式传送数据。开发者把用户信息以xml格式发送给第三方接口
//   3-第三方接口获取开发者的xml数据,通过数据的查询,把结果再以xml的格式发送给开发者。


//首先检测是否支持curl
if (!extension_loaded("curl")) {
    trigger_error("对不起,请开启curl功能模块!", E_USER_ERROR);
}

//构造xml
$xmldata="<?xml version=‘1.0‘ encoding=‘UTF-8‘?><group><name>张三</name><age>22</age></group>";

//初始一个curl会话
$curl = curl_init();

//设置url
curl_setopt($curl, CURLOPT_URL,"http://localhost/demo/dealxml.php");

//设置发送方式:post
curl_setopt($curl, CURLOPT_POST, true);

//设置发送数据
curl_setopt($curl, CURLOPT_POSTFIELDS, $xmldata);

//TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);

//执行cURL会话 ( 返回的数据为xml )
$return_xml = curl_exec($curl);

//关闭cURL资源,并且释放系统资源
curl_close($curl);

//echo $return_xml;
//exit;

//禁止引用外部xml实体
libxml_disable_entity_loader(true);
//先把xml转换为simplexml对象,再把simplexml对象转换成 json,再将 json 转换成数组。
$value_array = json_decode(json_encode(simplexml_load_string($return_xml, ‘SimpleXMLElement‘, LIBXML_NOCDATA)), true);

echo "<pre>";
print_r($value_array);
?>

 

第三方接口端:接收请求,并返回处理结果

<?php

//接收传送的数据
$fileContent = file_get_contents("php://input"); 


### 把xml转换为数组
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
//先把xml转换为simplexml对象,再把simplexml对象转换成 json,再将 json 转换成数组。
$value_array = json_decode(json_encode(simplexml_load_string($fileContent, ‘SimpleXMLElement‘, LIBXML_NOCDATA)), true);


### 获取值,进行业务处理
$name = $value_array[‘name‘];
$age = $value_array[‘age‘];
// 通过查询,判断该用户是否存在


### 把查询结果添加到数组中
$value_array[‘result‘] = 1;


### 把数组转换为xml格式,返回
$xml = "<?xml version=‘1.0‘ encoding=‘UTF-8‘?><group>";
foreach ($value_array as $key=>$val)
{
    if (is_numeric($val)){
        $xml.="<".$key.">".$val."</".$key.">";
    }else{
        $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
    }
}
$xml.="</group>";




echo $xml;

?>

 

以上是关于php如何解析多级xml报文?的主要内容,如果未能解决你的问题,请参考以下文章

PHP通过XML报文方式,已第三方接口交互(发送xml,获取XML,并解析xml步骤)

java如何组装xml报文

PHP通过XML报文格式的POST请求方式,与第三方接口交互(发送xml,获取XML,并解析xml步骤)

java怎么解析文本文件中的soap报文

Qt解析多级xml文件

解析xml文件,如何动态的封装成一个java类