【问题标题】:Parse a XML from a string that contains other additional rubbish in php从包含 php 中其他附加垃圾的字符串中解析 XML
【发布时间】:2012-11-14 15:41:09
【问题描述】:

我正在连接一个支付网关,该网关应该返回一个我应该解析的 XML 字符串。但是,WS 返回的字符串在实际 XML 之前包含一个 HTML 标头。

我已经和那里的技术人员谈过了,他们说他们的系统就是这样工作的,我应该按照自己的方式进行管理。

所以我的问题是:有没有一种简单的方法可以只从字符串中提取 XML 并丢弃其余部分?

谢谢!

感谢所有回复!我在下面添加了一个示例。

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 300
Content-Type: text/html; charset=utf-8
X-AspNet-Version: 2.0.50727
Date: Fri, 23 Nov 2012 15:02:17 GMT

<?xml version='1.0' encoding='utf-8' standalone='yes' ?><Inicio><Nrocom>xxxxxx</Nrocom><Nroterm>xxxxxx</Nroterm><Moneda>858</Moneda><Importe>000</Importe><Plan>001</Plan><Tcompra>0</Tcompra><Info></Info><Rsp>2222</Rsp><Idtrn>000000</Idtrn></Inicio>Thread was being aborted.Thread was being aborted.

这整个块是来自这个网关的正常响应。忽略“线程被中止。线程被中止”。消息,他们说他们正在努力。

【问题讨论】:

  • 确实这应该是他们的问题,但是您能发布一个错误 XML 的示例吗?
  • 向我们展示一个响应示例,我什至敢说您可以使用 simplexml 类加载整个内容并从您想要的节点导出。

标签: php xml string parsing


【解决方案1】:

所以我刚刚看到你的编辑,你想做的是找到 &lt;?xml 并只解析这个。

$beginTag = "<?xml";
$xmlDoc = substr($response, strpos($response, $beginTag));

echo $xmlDoc;

这段代码给出了这个输出:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?><Inicio><Nrocom>xxxxxx</Nrocom><Nroterm>xxxxxx</Nroterm><Moneda>858</Moneda><Importe>000</Importe><Plan>001</Plan><Tcompra>0</Tcompra><Info></Info><Rsp>2222</Rsp><Idtrn>000000</Idtrn></Inicio>Thread was being aborted.Thread was being aborted.

很明显,XML 是无效的,但我想当Thread was being aborted. 问题得到修复时,您将收到有效的 XML!

【讨论】:

    【解决方案2】:

    嗯,我有点让它以某种方式工作。

    不要将此视为完美的解决方案。我很确定还有很多其他更好的方法可以做到这一点,因为我不得不“学习”正则表达式来获得它。

    思路很简单,使用正则表达式获取XML的&lt;?xml标签和结束标签。函数 preg_match() 然后返回 $matches 数组中的所有内容。

    希望对您有所帮助。

    <?php
    $exp = '/<\?xml.*<\/Inicio>/';
    preg_match($exp, $string, $matches ,PREG_OFFSET_CAPTURE, 0);
    echo $matches[0][0];
    ?>
    

    【讨论】:

      【解决方案3】:

      这是一个非常简洁的示例,说明了在您不了解您正在使用的数据的情况下的一种可能性。

      $string = '
      <html>
        <head>
          <title>Untitled</title>
        </head>
        <body>
          <xmlroot>
            <item>hello</item>
            <item>world</item>
          </xmlroot>
        </body>
      </html>
      ';
      
      if($xml = new SimpleXMLElement($string) and $item = $xml->xpath('//xmlroot'))
      {
        echo $item[0]->asXML();
      }
      

      【讨论】:

      • 小心使用“and”关键字。这可以重写为:if(($xml = new SimpleXMLElement($string)) &amp;&amp; ($item = $xml-&gt;xpath('//xmlroot'))) 可能没有那么漂亮,但不太可能让人们失望。
      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 2010-12-06
      • 1970-01-01
      • 2013-01-10
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多