【问题标题】:How to ignore SimpleXML errors when trying to prettify XML string output尝试美化 XML 字符串输出时如何忽略 SimpleXML 错误
【发布时间】: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-&gt;asXML();。您不能直接删除它,然后直接在原始的非 XML 字符串上运行您的正则表达式吗?
  • 它必须是 XML 字符串,因为我们从服务器中提取 xml 数据作为字符串
  • 这根本不能回答我的问题。我是说你可以用$xml = explode("\n", preg_replace('/&gt;\s*&lt;/', "&gt;\n&lt;", $xml)); 替换$xml = explode("\n", preg_replace('/&gt;\s*&lt;/', "&gt;\n&lt;", $xml_obj-&gt;asXML()));。这段代码中$xml_obj的用途是什么?
  • 啊,是的,我可以替换它,但没有任何区别..如果 xml 无效,我仍然会收到错误
  • 哪里会出现错误?如果您从未使用过$xml_obj,则无需运行new SimpleXMLElement;如果您不运行它,则不会引发任何错误。

标签: php xml xml-parsing simplexml


【解决方案1】:

IMSoP 解决的问题

替换 $xml = explode("\n", preg_replace('/>\s*\nasXML()));

with $xml = explode("\n", preg_replace('/>\s*\n

完全删除了 $xml_obj 变量。现在得到完整的很好编辑的 xml,即使它有错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多