如何用 php 解析 Microsoft xml
How parse microsoft xml with php
我尝试使用函数 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);
如果您查看粘贴的字符串,您会发现它的开头和结尾标签不同,而有效的 XML 文档始终如此。这大概就是您所说的解析错误,但您没有 post 完整消息(未来提示:always post 错误消息;如果这对你来说毫无意义,它可能会给阅读的人提供线索。
看起来你看到的实际上是两个 XML个文件,一个接一个;或者可能显示的两个元素应该被包裹在一个外部元素中,但是您的代码或服务器上的代码正在将其剥离。您可以尝试查看原始 SOAP 响应(使用 SoapClient 的“trace”选项和 __getResponse() 方法,如果我没记错的话)以获得更清晰的画面。
一种可能的解决方法是添加您自己的包装器 - $xml = "<whatever>$xml</whatever>";
- 然后对其进行解析。
我尝试使用函数 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);
如果您查看粘贴的字符串,您会发现它的开头和结尾标签不同,而有效的 XML 文档始终如此。这大概就是您所说的解析错误,但您没有 post 完整消息(未来提示:always post 错误消息;如果这对你来说毫无意义,它可能会给阅读的人提供线索。
看起来你看到的实际上是两个 XML个文件,一个接一个;或者可能显示的两个元素应该被包裹在一个外部元素中,但是您的代码或服务器上的代码正在将其剥离。您可以尝试查看原始 SOAP 响应(使用 SoapClient 的“trace”选项和 __getResponse() 方法,如果我没记错的话)以获得更清晰的画面。
一种可能的解决方法是添加您自己的包装器 - $xml = "<whatever>$xml</whatever>";
- 然后对其进行解析。