我使用内置的PHP SOAP
函数和CURL
发送请求并从.Net ASMX web service
获取响应。
目前我以XML格式接收响应,但需要一些帮助从XML中提取信息,因为我需要的数据嵌套在XML中。例如,只提取我需要的内容并将其转换为数组以便将其直接发送到数据库。
XML开始如下:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <GetViewBidResponse xmlns="http://domain.com/SolutionWebService"> <GetViewBidResult> <message>OK</message> <table> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Bidrod" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Bid"> <xs:complexType> <xs:sequence> <xs:element name="rows" msprop:ColumnId="1" type="xs:string" minOccurs="0"/> <xs:element name="Queue" msprop:ColumnId="2" type="xs:string" minOccurs="0"/> <xs:element name="Running" msprop:ColumnId="3" type="xs:string" minOccurs="0"/> <xs:element name="New" msprop:ColumnId="4" type="xs:string" minOccurs="0"/> <xs:element name="Working" msprop:ColumnId="5" type="xs:string" minOccurs="0"/> <xs:element name="Done" msprop:ColumnId="6" type="xs:string" minOccurs="0"/> <xs:element name="Agree" msprop:ColumnId="7" type="xs:string" minOccurs="0"/> <xs:element name="Canceled" msprop:ColumnId="8" type="xs:string" minOccurs="0"/> <xs:element name="Hold" msprop:ColumnId="9" type="xs:string" minOccurs="0"/> <xs:element name="Test" msprop:ColumnId="10" type="xs:string" minOccurs="0"/> <xs:element name="All" msprop:ColumnId="11" type="xs:string" 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=""> <Bid diffgr:id="Bid1" msdata:rowOrder="0" diffgr:hasChanges="inserted"> <rows>1</rodun> <Queue>Testqueue1</Queue> <Running>1</Running> <New>2</New> <Working>7</Working> <Done>4802</Lokið> <Agree>1</Agree> <Canceled>87</Canceled> <Hold>3</Hold> <Test>0</Test> <All>4902</All> </Bid> <Bid diffgr:id="Bid2" msdata:rowOrder="1" diffgr:hasChanges="inserted"> <rows>1</rodun> <Queue>Testqueue2</Queue> <Running>23</Running> <New>q2</New> <Working>27</Working> <Done>48</Lokið> <Agree>11</Agree> <Canceled>827</Canceled> <Hold>31</Hold> <Test>10</Test> <All>402</All> </Bid> <Bid diffgr:id="Bid3" msdata:rowOrder="2" diffgr:hasChanges="inserted"> ...shortened, this continues from "diffgr:id="Bid1" to "diffgr:id="Bid97"...我想要做的是提取每个元素
<Bid diffgr:id="Bid1"
下的所有子元素(在DocumentElement
元素之后开始)。以仅包含以下信息的数组结束会很好:
[DocumentElement] => Array ( // Optional [Bid] => Array ( // Optional [0] => Array ( [rows] => 1 [Queue] => Testqueue1 [Running] => 1 [New] => 2 [Working] => 7 [Done] => 4802 [Agree] => 1 [Canceled] => 87 [Hold] => 3 [Test] => 0 [All] => 4902 ) [1] => Array ( [rows] => 1 [Queue] => Testqueue2 [Running] => 1 [New] => 4 [Working] => 3 ... and continues with all "Bid diffgr:id="BidXX" (number can reach 99) ...如果我只能提取我需要的数组,就可以获得帮助,那么我可以管理其余部分(将它们添加到数据库中)。 我一直在看xpath,但没有成功绑定到正确的xpath元素。这是我试过的,但没有运气:
$xml = simplexml_load_string($response); $id = $xml->xpath("Bid[@id=Bid*]"); // Not sure how to use the wildcard var_dump($id);我也可以通过使用XML2ARRAY将整个XML转换为一个数组,但是我仍然只需要提取上面我需要的东西。 任何帮助,将不胜感激。
没有找到相关结果
已邀请:
2 个回复
faut
赞同来自:
我看到
将选择所有SoapClient
的优点,但想要回答xpath-part:<Bid>
节点及其子节点。要访问这些: 但是,XML中的此节点似乎已被破坏:vdicta
赞同来自:
您应该使用SoapClient类进行SOAP通信。尽管可以仅使用低级HTTP和XML处理来实现soap客户端,但我不建议您在大多数情况下执行此操作,因为如果数据结构变得复杂,这可能会很奇怪。 使用我链接的页面及其上的注释作为一个很好的起点。这是另一个教程链接:http://devzone.zend.com/25/php-soap-extension/