2013-04-11 2 views
1

Я использую встроенную функцию 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 но мне еще нужно извлечь только то, что мне нужно было указано выше.

Любая помощь будет оценена по достоинству.

ответ

3

я вижу преимущество SoapClient, но хочу, чтобы ответить на XPATH-части:

$results = $xml->xpath("//Bid"); 

отберет все <Bid> узлов и их ребенок. Чтобы получить доступ к тем:

foreach ($results as $result) { 

    echo $result->rows . "<br />"; 

} 

Этот узел в вашем XML, кажется, сломана, хотя:

<rows>1</rodun> 
+0

Спасибо 'michi', я как-то чувствую, что я это пробовал, но ваше предложение отлично работает. С этим я могу построить массив так, как хочу. Что касается сломанного XML, это моя вина, поскольку я переводил XML с иностранного языка на английский, чтобы публиковать здесь в Stackoverflow. Еще раз спасибо. –

+0

@SkuliAxelson: добро пожаловать, рад возможности помочь. – michi

1

Вы должны использовать класс SoapClient для связи SOAP. Хотя возможно реализовать клиент-мыльщик, используя низкий уровень Обработка HTTP и XML, я бы не советовал вам делать это в большинстве случаев, так как это может стать странным, если структуры данных будут сложными.

Используйте страницу, которую я связал, и комментарии к ней в качестве хорошей отправной точки. А вот еще одно звена учебника: http://devzone.zend.com/25/php-soap-extension/

+0

Спасибо 'hek2mgl. Я закончил использовать curl, поскольку я не мог получить SSL-аутентификацию, работающую только с SOAP. –

Смежные вопросы