使用命名空间从XML中提取数据

时间:2017-10-13 06:59:38

标签: php xml

我尝试在下面的代码中从XML下面提取数据,但得到一个空字符串。

XML

 <s:envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
      <s:body>
           <ns2:checkbalanceresponse xmlns:ns2="http://booking.us.org/">
                <return>
                     "<Balance><Airline><AirlineName>BUDDHA AIR</AirlineName><AgencyName>GANDAKI INTERNATIONAL TRAVELS KTM(STO)</AgencyName><BalanceAmount>5555</BalanceAmount></Airline></Balance>"
                 </return>
            </ns2:checkbalanceresponse>
       </s:body>
 </s:envelope>

代码

 $doc = simplexml_load_string($response);
 $doc->registerXPathNamespace('ns2', 'http://booking.us.org/');
 $nodes = $doc->xpath('//ns2:checkbalanceresponse');
 $nodes = $nodes[0]->return;
 $obj = simplexml_load_string($nodes); 
 var_dump($obj->Balance->Airline->AirlineName);     //null 

2 个答案:

答案 0 :(得分:1)

你可以这样做。

  

问题: $nodes[0]->return;此语句将返回一个对象而不是字符串。

Try this code snippet here

$doc = simplexml_load_string($string);
$doc->registerXPathNamespace('ns2', 'http://booking.us.org/');
$nodes = $doc->xpath('//ns2:checkbalanceresponse');
$nodes=$nodes[0]->return; //here $nodes gives you an object instead of html

echo $nodes->Balance->Airline->AirlineName;

答案 1 :(得分:0)

由于<h1>A. title</h1> <div> Het museum werd ontworpen door architect Cor van Hillo! De totale kosten van 3,5 miljoen gulden werden door sponsors en fondsen bijeen gebracht. Onder andere door ANWB-leden werd 400.000 gulden gedoneerd. In 1992 werd begonnen met de bouw van het museum dat mede werd ingericht door het Haagse Museon. Op 9 maart 1993 opende prins Claus het museum door zich met een vuistbijl de toegang te verschaffen. <div> Het museum vertelt het geologische verhaal van de Veluwe en laat zien welke natuurlijke processen zich net en ver onder het aardoppervlak afspelen. Centraal in het Museonder hangt het wortelstelsel van een 135 jaar oude boom. Hiermee wordt het feit dat men zich onder het aardoppervlak bevindt extra versterkt. </div> In september 2017 werd bekend dat het plein waar nu het bezoekerscentrum en restaurant "De Koperen Kop" aan liggen zal worden gerenoveerd. Er komt een nieuw gebouw met de naam "Het Landhuis". Hier worden het bezoekers- en educatiecentrum, het restaurant en een parkwinkel ondergebracht. Door het verplaatsen van het bezoekerscentrum kan het Museonder worden vergroot en de collectie worden uitgebreid. </div> <h2>A subtitle</h2> <div>Some more text underneath a title</div> <button id='wrapDOM'>wrap the dom</button> innerText Result: <div id='innerText-result'> </div> textContent Result: <div id='textContent-result'> </div>的内容已经是XML,而不是必须将其作为字符串读取然后转换它,您的第一个simplexml_load_string已经完成了所有工作。您可以直接从XPath中访问该值...

<return>

更新:完整代码 - 根据问题......

$doc = simplexml_load_string($response);
$doc->registerXPathNamespace('ns2', 'http://booking.us.org/');
$airlineName = $doc->xpath('//ns2:checkbalanceresponse/return/Balance/Airline/AirlineName')[0];
echo $airlineName;

...输出

<?php
error_reporting ( E_ALL );
ini_set ( 'display_errors', 1 );

include_once("simple_html_dom.php");
$response = <<< XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<s:envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
      <s:body>
           <ns2:checkbalanceresponse xmlns:ns2="http://booking.us.org/">
                <return>
                     "<Balance><Airline><AirlineName>BUDDHA AIR</AirlineName><AgencyName>GANDAKI INTERNATIONAL TRAVELS KTM(STO)</AgencyName><BalanceAmount>5555</BalanceAmount></Airline></Balance>"
                 </return>
            </ns2:checkbalanceresponse>
       </s:body>
 </s:envelope>
XML;

$doc = simplexml_load_string($response);
$doc->registerXPathNamespace('ns2', 'http://booking.us.org/');
$airlineName = $doc->xpath('//ns2:checkbalanceresponse/return/Balance/Airline/AirlineName')[0];
echo $airlineName;