【发布时间】:2016-11-11 02:27:54
【问题描述】:
我有一个问题类似于之前提出的类似问题:How to parse an XML ignoring errors with SimpleXML
我已经编写了代码以使用 SimpleXMLElement 很好地缩进 XML 输出并使用字符串,当我有有效的 XML 时它可以工作,但是每当我得到错误的 xml 文件时我都会收到错误...
示例:
fafjdsj kfčasdkf dflčakč <?xml .... ENVELOPE> dsjkaljdlk <?xml .. fdsfsa.. ENVELOPE> sdfadf
所以基本上我有多个 xml 的混合字符串在一个和 xml 的一些随机单词之间(可以在 xml 内部或在示例中的两者之间......)
有没有办法解决这个问题?
我的代码(https://jsfiddle.net/72ygv2sb/):
<?php
$xml = 'opdfeakfjlčfkajf laesfa lfje akljč <?xml version="1.0" encoding="utf-8"?>dsfsadf<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></soapenv:Body> </soapenv:Envelope> faskfjasdf jdalkfj sdklfa alk <?xml version="1.0" encoding="utf-8"?>dsfsadf<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></soapenv:Body></soapenv:Envelope>';
function xmlpp($xml, $html_output=false) {
#$xml = explode("\n", preg_replace('/>\s*\n<"', $xml));
$xml_obj = new SimpleXMLElement($xml);
$level = 4;
$indent = 0; // current indentation level
$pretty = array();
// get an array containing each XML element
$xml = explode("\n", preg_replace('/>\s*</', ">\n<", $xml_obj->asXML()));
// shift off opening XML tag if present
if (count($xml) && preg_match('/^<\?\s*xml/', $xml[0])) {
$pretty[] = array_shift($xml);
}
foreach ($xml as $el) {
if (preg_match('/^<([\w])+[^>\/]*>$/U', $el)) {
// opening tag, increase indent
$pretty[] = str_repeat(' ', $indent) . $el;
$indent += $level;
} else {
if (preg_match('/^<\/.+>$/', $el)) {
$indent -= $level; // closing tag, decrease indent
}
if ($indent < 0) {
$indent += $level;
}
$pretty[] = str_repeat(' ', $indent) . $el;
}
}
$xml = implode("\n", $pretty);
return ($html_output) ? htmlentities($xml) : $xml;
}
echo '<pre>' . xmlpp($xml, true) . '</pre>' ;
?>
谢谢
【问题讨论】:
-
您的代码似乎根本没有真正使用 SimpleXML,因为除非我读错了,否则您可以有效地运行
$xml_obj = new SimpleXMLElement($xml); $xml = $xml_obj->asXML();。您不能直接删除它,然后直接在原始的非 XML 字符串上运行您的正则表达式吗? -
它必须是 XML 字符串,因为我们从服务器中提取 xml 数据作为字符串
-
这根本不能回答我的问题。我是说你可以用
$xml = explode("\n", preg_replace('/>\s*</', ">\n<", $xml));替换$xml = explode("\n", preg_replace('/>\s*</', ">\n<", $xml_obj->asXML()));。这段代码中$xml_obj的用途是什么? -
啊,是的,我可以替换它,但没有任何区别..如果 xml 无效,我仍然会收到错误
-
哪里会出现错误?如果您从未使用过
$xml_obj,则无需运行new SimpleXMLElement;如果您不运行它,则不会引发任何错误。
标签: php xml xml-parsing simplexml