【问题标题】:Parsing XML-Like Web Service (web service returns xml within a string)解析类似 XML 的 Web 服务(Web 服务在字符串中返回 xml)
【发布时间】:2013-08-30 13:48:12
【问题描述】:

我正在尝试解析“不那么正常”的 XML Web 服务。看起来 Web 服务正在返回一个字符串,该字符串中包含 XML。

XML 如下所示:

<string>
  <NewDataSet>
    <Table>
      <CATID>0</CATID>
      <DEPID>0</DEPID>
    </Table>
    <Table>
      <CATID>1</CATID>
      <DEPID>1</DEPID>
    </Table>
  </NewDataSet>
<string>

这是我现在的代码,我已经尝试了许多变体,但没有任何效果。大多数时候它什么都不返回。我已经回显了 $xml,它将返回所有 XML,但我只需要显示 CATID 即可。

<?php

$file = file_get_contents('http://theWebSericeLink.here');
$xml = simplexml_load_string($file);

 //echo $xml;
 foreach($xml->Table as $item) {
   echo $item->CATID;
 }
?>

我也试过了:

   foreach($xml->NewDataSet->Table as $item)

   foreach($xml->String->NewDataSet->Table as $item)

提前致谢。

【问题讨论】:

  • 最后一个结束标签(字符串)写错了(没有 /)。源码中是否存在这个错误?
  • @Will Irvine 你在检查我的答案吗
  • 抱歉,这是我的错字。来源确实有结束标签。
  • 顺便说一句 simplexml_load_file 会直接加载该 XML 文件 (URL)。

标签: php xml web-services


【解决方案1】:

试试这个

<?php
$k = '<string>
    <NewDataSet>
        <Table>
          <CATID>0</CATID>
          <DEPID>0</DEPID>
        </Table>
        <Table>
          <CATID>1</CATID>
          <DEPID>0</DEPID>
        </Table>
    </NewDataSet>
</string>';
$xml = simplexml_load_string($k);

   foreach($xml->NewDataSet->Table as $read){       
     echo $read->CATID."<br>";
    }
?>

输出

0
1

【讨论】:

  • 这在您的示例中确实有效,但使用我的 Web 服务的返回则不会。我不知道为什么,但无论我如何尝试,它都无法正常工作。这里的问题是我必须使用的网络服务,而不是你们。 :) 我确实想通了,看看我的答案。
【解决方案2】:

如果您在回显时可以看到 XML,那么您可能需要使用 xpath。

$id = $xml->xpath('/table/CATID'); 

【讨论】:

  • 我试过这个,但无法让它工作。不过我确实想通了,请查看我的答案。
【解决方案3】:

第一步,关闭最后的标签,并从“print_r”xml变量开始。

print_r($xml);

由于有父母和孩子标签,通过每个字段获得结果就像array

在你的情况下,

<string>
   <NewDataSet>
     <Table>

所以

$tables = $xml->NewDataSet->Table;

foreach ($tables as $table)
{
    foreach ($table->CATID as $catid){
        echo $catid, "\n";
    }
}

【讨论】:

  • 不解析字符串。错误发生。注意:尝试在第 16 行获取非对象的属性
  • 我试过这个,但无法让它工作。不过我确实想通了,请查看我的答案。
【解决方案4】:

我想通了。

在我的 foreach 函数之前,我从 Web 服务返回的“xml 字符串”创建了一个 xml 文件:

$xml = simplexml_load_string($file);
$feed = '<?xml version="1.0" encoding="ISO-8859-1"?>'.$xml;

file_put_contents("workhorse.xml", $feed);
$myxml=simplexml_load_file("workhorse.xml");

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 2012-04-05
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多