解析含HTML内容的XML数据:simplexml_load_string标签丢失问题
解决SimpleXML移除XML中HTML标签的问题
我懂你的问题啦——当你用simplexml_load_string($result, "SimpleXMLElement", LIBXML_NOCDATA)加载包含HTML内容的XML时,那些<br>之类的HTML标签都被过滤掉,只剩纯文本了,对吧?这是因为SimpleXML会把XML元素下的HTML标签当作独立的XML子节点处理,而不是文本内容的一部分,直接获取元素文本时就会忽略这些标签。
下面给你两种可行的解决方案:
方案一:用DOMDocument保留HTML结构(无需修改原XML)
如果没法调整原始XML的输出格式,用DOMDocument可以完美保留HTML标签的结构,步骤如下:
// 你的原始XML数据 $result = '<JUDGMENT> <summary>INTRODUCTION: <br />This appeal borders on the Law of Contract.<br /><br />FACTS: <br />From the statement of claim filed by the plaintiff (respondent) breach of contract and negligence were said to have been committed against...</summary></JUDGMENT>'; // 初始化DOMDocument $dom = new DOMDocument(); // 禁用XML错误提示(避免HTML标签引发的警告) libxml_use_internal_errors(true); $dom->loadXML($result); libxml_clear_errors(); // 定位到summary元素 $summaryNode = $dom->getElementsByTagName('summary')->item(0); // 提取summary元素内的完整HTML内容 $htmlContent = ''; foreach ($summaryNode->childNodes as $child) { $htmlContent .= $dom->saveHTML($child); } // 输出结果,会保留所有<br>标签 echo $htmlContent;
这段代码会遍历summary节点下的所有子节点(包括文本和HTML标签),用saveHTML()把每个节点转换成字符串,最终拼接出完整的带HTML标签的内容。
方案二:让XML输出把HTML放在CDATA块中(更简便)
如果能控制数据源的XML生成逻辑,把包含HTML的内容放在<![CDATA[...]]>块里,这样SimpleXML就能直接识别为纯文本保留所有标签:
修改后的XML示例:
<JUDGMENT> <summary><![CDATA[INTRODUCTION: <br />This appeal borders on the Law of Contract.<br /><br />FACTS: <br />From the statement of claim filed by the plaintiff (respondent) breach of contract and negligence were said to have been committed against...]]></summary> </JUDGMENT>
这时候你原来的代码就能直接拿到带HTML标签的内容了:
$xml = simplexml_load_string($result, "SimpleXMLElement", LIBXML_NOCDATA); $summaryContent = (string)$xml->summary; echo $summaryContent; // 会显示带<br>标签的完整内容
内容的提问来源于stack exchange,提问作者funsholaniyi
相关产品推荐
相关产品推荐

