【问题标题】:How parse microsoft xml with php如何用php解析microsoft xml
【发布时间】:2021-08-23 03:40:09
【问题描述】:

我尝试使用函数 simplexml_load_string() 解析从服务器接收的 xml,但我收到解析错误。是另一种解析这个xml的方法吗? print_r($result1->GetChannelMeasurementResul->any)给:

<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"><xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Measurements" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="Measurements"><xs:complexType><xs:sequence><xs:element name="Station" type="xs:long" minOccurs="0"/><xs:element name="ChannelID" type="xs:int" minOccurs="0"/><xs:element name="DateTime" type="xs:dateTime" minOccurs="0"/><xs:element name="Value" type="xs:double" minOccurs="0"/><xs:element name="Status" type="xs:int" minOccurs="0"/></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><DocumentElement xmlns=""><Measurements diffgr:id="Measurements1" msdata:rowOrder="0"><Station>12</Station><ChannelID>6</ChannelID><DateTime>2021-06-04T18:10:00+02:00</DateTime><Value>13.77392</Value><Status>0</Status></Measurements><Measurements diffgr:id="Measurements2" msdata:rowOrder="1"><Station>12</Station><ChannelID>6</ChannelID><DateTime>2021-06-04T18:11:00+02:00</DateTime><Value>13.77652</Value><Status>0</Status></Measurements><Measurements diffgr:id="Measurements3" msdata:rowOrder="2"><Station>12</Station><ChannelID>6</ChannelID><DateTime>2021-06-04T18:12:00+02:00</DateTime><Value>13.77884</Value><Status>0</Status></Measurements></DocumentElement></diffgr:diffgram>

我试试

$result1 = $client->__soapCall('GetChannelMeasurement', array( $measerement)); $results2=simplexml_load_string($result1->GetChannelMeasurementResult->any);

【问题讨论】:

  • 您能与我们分享您尝试过的代码吗?
  • 您发布的代码看起来像是来自服务器的原始响应。 simplexml_load_string() 用于处理干净的 XML 文件。
  • 我尝试使用 ``` $result1 = $client->__soapCall('GetChannelMeasurement', array( $measerement)); $results2=simplexml_load_string($result1->GetChannelMeasurementResult->any);```
  • 这可能是来自GetChannelMeasurementResult->any 的返回值不是你想要的。 print_r($result1->GetChannelMeasurementResult); 给了什么?
  • 第一篇文章中的xml

标签: php xml soap xml-parsing


【解决方案1】:

如果您查看已粘贴的字符串,您会发现它的开头和结尾不是相同的标记,而有效的 XML 文档总是如此。这大概就是您所说的解析错误,但您没有发布完整的消息(未来提示:总是发布错误消息;如果它对您没有任何意义,它可能会提供线索给正在阅读的人)。

您所看到的实际上是两个 XML 文档,一个接一个;或者可能显示的两个元素应该包装在外部元素中,但是您的代码或服务器上的代码正在剥离它。您可以尝试查看原始 SOAP 响应(使用 SoapClient 的“trace”选项和 __getResponse() 方法,如果我没记错的话)以获得更清晰的图片。

一种可能的解决方法是添加您自己的包装器 - $xml = "<whatever>$xml</whatever>"; - 然后对其进行解析。

【讨论】:

  • 感谢您的提示。我使用了不同的功能,我得到了常规的肥皂 xml 响应 $result = $client->GetChannelMeasurements($measerement); $result1=$client->__getLastResponse(); $doc = new DOMDocument('1.0', 'utf-8'); $doc->loadXML( $soapResponse ); var_dump(doc); $XMLresults = $doc->getElementsByTagName("Measurements"); $XMLresults = $doc->getElementsByTagName("Value"); var_dump($XMLresults); $output = $XMLresults->item(2)->nodeValue;
猜你喜欢
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多