XML转HTML问题求助:foreach循环仅输出标签,标签内文本无法显示
解决XML转HTML时无法显示CDATA文本内容的问题
嘿,我来帮你搞定这个问题!你遇到的情况大概率是遍历XML时,直接输出了节点对象本身,而没有正确提取CDATA块里的文本内容——毕竟XML里的<![CDATA[...]]>是用来包裹特殊字符的,解析时需要专门取出它的内容才行。
问题根源
你提到只能输出XML标签,说明你的代码可能只是把节点(比如$application->ACTION)直接打印了,而没有获取它的文本值。很多XML解析库(比如PHP的SimpleXML)会把节点封装成对象,直接输出对象只会显示标签相关的信息,不会自动取出CDATA里的内容。
解决方案(以PHP为例,两种常用解析方式)
方式1:使用SimpleXML(简洁易用)
SimpleXML会自动处理CDATA内容,你只需要把节点对象强制转换成字符串就能拿到文本:
// 加载XML文件(也可以用 simplexml_load_string 加载字符串形式的XML) $xml = simplexml_load_file('your_jobs.xml'); // 遍历每个APPLICATION节点 foreach ($xml->APPLICATION as $application) { // 强制转换为字符串,提取CDATA里的内容 $action = (string)$application->ACTION; $jobId = (string)$application->JOBID; // 自动解析转义字符,比如'会变成单引号 $jobTitle = (string)$application->JOBTITLE; // 输出HTML格式的内容 echo "<div class='job-card'>"; echo "<h3>Job ID: {$jobId}</h3>"; echo "<p><strong>Action:</strong> {$action}</p>"; echo "<p><strong>Title:</strong> {$jobTitle}</p>"; echo "</div>"; }
方式2:使用DOMDocument(更灵活,适合复杂XML)
如果你需要更精细的控制,DOMDocument也是不错的选择,通过nodeValue属性获取文本内容:
$dom = new DOMDocument(); // 加载XML时忽略无关的警告(可选) libxml_use_internal_errors(true); $dom->load('your_jobs.xml'); libxml_clear_errors(); // 获取所有APPLICATION节点 $applications = $dom->getElementsByTagName('APPLICATION'); foreach ($applications as $app) { // 逐个获取子节点的文本内容 $action = $app->getElementsByTagName('ACTION')->item(0)->nodeValue; $jobId = $app->getElementsByTagName('JOBID')->item(0)->nodeValue; $jobTitle = $app->getElementsByTagName('JOBTITLE')->item(0)->nodeValue; // 输出HTML结构 echo "<div class='job-entry'>"; echo "<h4>Job #{$jobId}</h4>"; echo "<ul>"; echo "<li>操作类型:{$action}</li>"; echo "<li>职位名称:{$jobTitle}</li>"; echo "</ul>"; echo "</div>"; }
额外提示
- 如果XML里可能存在空节点,记得加判断避免报错,比如:
$jobTitle = isset($application->JOBTITLE) ? (string)$application->JOBTITLE : '无职位名称'; - 转义字符(比如
')会被自动解析成对应的字符(单引号),不需要额外处理。
内容的提问来源于stack exchange,提问作者denny
相关产品推荐
相关产品推荐

