Я использую встроенную функцию PHP SOAP
и CURL
для отправки запроса и получения ответа от .Net ASMX web service
.PHP XML - Извлечение повторяющегося элемента и дочерних элементов в массив
В настоящее время я получаю ответ как 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);
Я также был в состоянии преобразовать весь XML в массив с помощью XML2ARRAY но мне еще нужно извлечь только то, что мне нужно было указано выше.
Любая помощь будет оценена по достоинству.
Спасибо 'michi', я как-то чувствую, что я это пробовал, но ваше предложение отлично работает. С этим я могу построить массив так, как хочу. Что касается сломанного XML, это моя вина, поскольку я переводил XML с иностранного языка на английский, чтобы публиковать здесь в Stackoverflow. Еще раз спасибо. –
@SkuliAxelson: добро пожаловать, рад возможности помочь. – michi