脚本宝典收集整理的这篇文章主要介绍了在使用DOMDocument函数进行处理之前,在PHP中修复格式错误的XML,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
很明显,XML格式不正确,并且包含应转换为XML实体的非法字符.
这是因为XML提要由许多其他用户提供的数据组成,显然它在我获得之前没有经过验证或重新格式化.
我已经与XML Feed的供应商交谈了,他们说他们正试图让内容提供商对其进行排序,但这看起来很愚蠢,因为他们应该首先验证输入.
我基本上需要修复XML纠正任何编码错误并将任何非法字符转换为XML实体,以便在使用PHP的DOMDocument函数时XML加载问题.
我的代码目前看起来像:
$FeedURL = '3704017_14022010_050004.xml'; $dom = new DOMDocument(); $dom->load($FeedURL);
包含尚未转换为XML实体的字符的示例XML:
<?xml version="1.0"?> <Feed> <RECORD> <ID>117387</ID> <ADVERTISERNAME>test</ADVERTISERNAME> <aiD>10544740</AID> <NAME>This & This</NAME> <DESCRIPTION>For one day only this is > than this.</DESCRIPTION> </RECORD> </Feed>
<?xml version="1.0"?> <Feed> <RECORD> <ID>117387</ID> <ADVERTISERNAME>Test < texter</ADVERTISERNAME> <AID>10544740</AID> <NAME>This & This</NAME> <DESCRIPTION>For one day only this is > than this.</DESCRIPTION> </RECORD> </Feed>
会是这样的:
function cleanupXML($xml) { $xmlOut = ''; $inTag = false; $xmlLen = strlen($xml); for($i=0; $i < $xmlLen; ++$i) { $char = $xml[$i]; // $nextChar = $xml[$i+1]; switch ($char) { case '<': if (!$inTag) { // Seek forward for the next tag boundry for($j = $i+1; $j < $xmlLen; ++$j) { $nextChar = $xml[$j]; switch($nextChar) { case '<': // Means a < in text $char = htmlentities($char); break 2; case '>': // Means we are in a tag $inTag = true; break 2; } } } else { $char = htmlentities($char); } break; case '>': if (!$inTag) { // No need to seek ahead here $char = htmlentities($char); } else { $inTag = false; } break; default: if (!$inTag) { $char = htmlentities($char); } break; } $xmlOut .= $char; } return $xmlOut; }
以上是脚本宝典为你收集整理的在使用DOMDocument函数进行处理之前,在PHP中修复格式错误的XML全部内容,希望文章能够帮你解决在使用DOMDocument函数进行处理之前,在PHP中修复格式错误的XML所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。