new SimpleXMLElement() 解析元素对象操作XML
用到的方法:
->addChild
->addAttribute
->setAttribute
->createCDATASection
例如,有一段xml代码
1.需求:在APPList节点内增加若干个子节点,并为其添加(修改)属性
$DstXML = <<<XML
<Data Type="CC" Idx="0" >
<Param>
<APPList></APPList>
</Param>
</Data>
XML;
如果节点值或属性中有中文,需要带上编码方式
//解决PHP使用new SimpleXMLElement创建节点赋值时中文问题的方法
是在创建SimpleXMLElement对象时指定编码格式为UTF-8
$DstXML = '<?xml version="1.0" encoding="UTF-8"?>
<Data Type="CC" Idx="0" >
<Param>
<APPList></APPList>
</Param>
</Data>';
2.分析:此时$DstXML是字符串类型,因此使用php内置方法将其转为XML对象,再获取父节点APPList,然后直接使用方法添加节点和属性,(也可以给节点添加数据)最后使用asXML()方法将xml对象转为xml文本
$dxml = new SimpleXMLElement($DstXML);
$root= $dxml->Param->APPList;
$app = $root->addChild('APP');
//也可以在新增节点的同时添加值 $app = $root->addChild('APP','data');
//或者直接给APPList节点增加值 $dxml->Param->APPList = 'data';
$app ('ID','12345678');
//修改则用setAttribute
$res = $dxml->asXML();
3.结果:
<Data Type="CC" Idx="0" >
<Param>
<APPList>
<APP ID="12345678"></APP>
//<APP>data</APP>
</APPList>
</Param>
</Data>
4.延伸:如果遇到需要转义的字符,可以使用 由 "<![CDATA[" 开始,由 "]]>" 结束
此方法不会对内容进行解析,而以原格式传输,以下为php语法做了一个封装
//创建类函数实现
class SimpleXMLExtended extends SimpleXMLElement{
public function addCData($cdata_text){
$node = dom_import_simplexml($this);
$no = $node->ownerDocument;
$node->appendChild($no->createCDATASection($cdata_text));
}
}
$DstXML = <<<XML
<DstRes Type="SC" Idx="0" OptID="CTL_IA_AddPUSelfAIList">
<Param>
<APPList></APPList>
</Param>
</DstRes>
XML;
$dxml = new SimpleXMLExtended($DstXML);
$root = $dxml->Param->APPList;
$row = new stdClass();
$row->AI = 'duixiang';
$jsonString = json_encode($row);
$root ->addCData($jsonString);
echo $dxml->asXML();
得到结果:
<?xml version="1.0"?>
<DstRes Type="SC" Idx="0" OptID="CTL_IA_AddPUSelfAIList">
<Param>
<APPList><![CDATA[{"AI":"duixiang"}]]></APPList>
</Param>
</DstRes>
另一种方法解析XML文档对象,new DOMDocument();
$xmldoc = new DOMDocument();
$xmldoc->loadXML($XMLContent);
获取父节点->getElementsByTagName
创建子节点->createElement
创建属性名->createAttribute
节点添加属性->setAttributeNode
父节点添加子节点->appendChild