首页 > 解决方案 > 如何用php解析microsoft xml

问题描述

我尝试使用函数 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);

标签: phpxmlsoapxml-parsing

解决方案


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

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

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


推荐阅读