парсинг DOMNodeList в PHP - PullRequest
       3

парсинг DOMNodeList в PHP

2 голосов
/ 21 января 2011

Веб-сервис возвращает Xml формата

<string>
  <NewDataSet>
    <DealBlotter>
      <CustomerReference>161403239</CustomerReference>
      <Symbol>EUR/USD</Symbol>
      <BuySell>S</BuySell>
      <ContractValue>-100000</ContractValue>
      <Price>1.35070</Price>
      <CounterValue>-135070</CounterValue>
      <TradeDate>2011-01-20 22:05:21.690</TradeDate>
      <ConfirmationNumber>78967117</ConfirmationNumber>
      <Status>C</Status>
      <lTID>111913820</lTID>
    </DealBlotter>
  </NewDataSet>
</string>

Теперь я использую curl для доступа к этому, а затем -

$xml = simplexml_load_string($result);
$dom = new DOMDOcument();

// Load your XML as a string
$dom->loadXML($xml);

// Create new XPath object
$xpath = new DOMXpath($dom);

$res = $xpath->query("/NewDataSet/DealBlotter");

foreach($res as $node)
{
    print "i went inside foreach";
    $custref =  ($node->getElementsByTagName("CustomerReference")->item(0)->nodeValue);
    print $custref;
    $ccy = ($node->getElementsByTagName("Symbol")->item(0)->nodeValue);
    print $ccy;
    $type = ($node->getElementsByTagName("BuySell")->item(0)->nodeValue);
    $lots = ($node->getElementsByTagName("ContractValue")->item(0)->nodeValue);
    $price = ($node->getElementsByTagName("Price")->item(0)->nodeValue);
    $confnumber = ($node->getElementsByTagName("ConfirmationNumber")->item(0)->nodeValue);
    $status = ($node->getElementsByTagName("Status")->item(0)->nodeValue);
    $ltid = ($node->getElementsByTagName("lTID")->item(0)->nodeValue);
    $time = ($node->getElementsByTagName("TradeDate")->item(0)->nodeValue);

}

Но ничего не печатается. , кроме фиктивного заявления. использование $res = $xpath->query("/string/NewDataSet/DealBlotter"); не помогло. Также print_r($res); дает вывод как DOMNodeList obect.

При этом также ничего не печатается

$objDOM = new DOMDocument(); 
$objDOM->load($result);
$note = $objDOM->getElementsByTagName("DealBlotter");
foreach( $note as $value )
{       
    print "hello";  
    $tasks = $value->getElementsByTagName("Symbol");
    $task  = (string)$tasks->item(0)->nodeValue;

    $details = $value->getElementsByTagName("Status");
    $detail  = (string)$details->item(0)->nodeValue;

    print "$task :: $detail <br>"; 
}

1 Ответ

0 голосов
/ 21 января 2011

Есть несколько проблем.

С тем, как вы загружаете XML. Избавьтесь от линии simplexml. Это не нужно, и все портит. Вместо этого просто сделайте $dom->loadXml($result);. Нет необходимости сначала загружать SimpleXML, если вы собираетесь передать его непосредственно в DomDocument.

По вашему запросу оператор / является оператором прямого потомка. Так что это значит, прямо рядом с. Таким образом, ваш первый тег должен быть корневым. Так что либо добавьте на него рут:

$res = $xpath->query("/string/NewDataSet/DealBlotter");

Или сделайте начальную косую черту в //, которая выбирает любого подходящего потомка:

$res = $xpath->query("//NewDataSet/DealBlotter");

И, наконец, выполнение var_dump на $res мало что скажет вам. Вместо этого мне нравится делать var_dump($res->length), так как он скажет вам, сколько совпадений у него есть, а не то, что это домноделист (который вы уже знаете) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...