簡體   English   中英

如何使用 simplexmlelement 解析 PHP 中的 XML?

[英]How to Parse XML in PHP with simplexmlelement?

我正在嘗試使用 simplexmlelement 在 php 中解析一個 xml 文件。

 <OrderResponse>
      <OrderResponseReferences>
           <BuyersOrderNumber Preserve="true">100000002</BuyersOrderNumber>
           <SuppliersOrderReference Preserve="true">6711637</SuppliersOrderReference>
      </OrderResponseReferences>
 </OrderResponse>

我正在使用下面的代碼訪問buyersOrderNumber

$local_file_path = "C:/etrade_files/Orders/order_acknowledgements/ORA1707220-05-2015--16-48-31.xml";
        
$xml = simplexml_load_file($local_file_path);
        
foreach($xml->children() as $child) 
{
    $child = $child->getName();
            
    if($child == "OrderResponseReferences")
    {
        $order_reference = $xml->$child->BuyersOrderNumber;
                
        print_r($order_reference);
    }   
}
        

結果:

 SimpleXMLElement Object ( [@attributes] => Array ( [Preserve] => true ) [0] => 100000002 )

我怎樣才能得到100000002的訂單號

此外,這個文件有多個訂單行,如果有人能解釋我可以用來獲取所有必需信息的邏輯,它真的會對我有幫助。

 <OrderResponseLine>
      <LineNumber>1</LineNumber>
      <OrderResponseLineReferences>
           <BuyersOrderLineReference Preserve="true">100000002</BuyersOrderLineReference>
      </OrderResponseLineReferences>
      <Product>
           <SuppliersProductCode>108696</SuppliersProductCode>
      </Product>
      <Quantity>
           <Amount>2</Amount>
      </Quantity>
      <LineTotal>331.18</LineTotal>
 </OrderResponseLine>

如果您將對象轉換為字符串,它將使用其值並進行轉換:

print_r((string) $order_reference);
// 100000002

我試過你的代碼,你做得很好! 只是(string)應該足以讓腳本運行。

我建議您使用 DOM 來解析此 XML。

$xml = new DOMDocument();
$xml->load('ORA1707220-05-2015--16-48-31.xml');
$root = $xml->getElementsByTagName('OrderResponse');
$tree = $root->item(0);
$child = $tree->childNodes;
foreach($child as $children){
    switch($children->nodeName){
         case 'OrderResponseReferences':
             //instructions
    }
}

並使用nodeValue獲取節點的值。

function seems me working to get this value. DOMDocument函數似乎我正在努力獲得這個值。

$xml = new DOMDocument();
$xml->load('ORA1707220-05-2015--16-48-31.xml');
$root = $xml->getElementsByTagName('OrderResponse');
$tree = $root->item(0);

parse($tree);

function parse($tree){
    $child = $tree->childNodes;

    foreach($child as $children){
        switch($children->nodeName){
             //Case
                 //instructions
        }


        if($child->hasChildNodes())
            parse($child);
        }

 }

如果當前節點有子節點,它會在子節點上再次調用 parse(),你會得到你想要的值

更簡單的方法

檢索許多<BuyersOrderNumber>

使用xpath

$numbers = $xml->xpath("//BuyersOrderNumber");

解釋:

  • xpath語句將選擇任何<BuyersOrderNumber>
  • XML 樹中的任何位置(由於節點名稱前面有//
  • $numbers將保存一個SimpleXML元素數組

輸出所有節點:

foreach ($numbers as $n)
    echo $n; 

檢索單個<BuyersOrderNumber>節點

  1. 標准方法:如果 XML 中只有一個這樣的節點:

     echo $xml->OrderResponseReferences->BuyersOrderNumber;
  2. 再次xpath

     echo $xml->xpath("//BuyersOrderNumber")[0];

    獲取所有節點並僅回顯第一個(這就是[0]的原因)

查看一個工作示例: https : //eval.in/368739

當然,示例中的$xml是..

$xml = simplexml_load_file($local_file_path);

參考: http : //php.net/manual/en/simplexml.examples-basic.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM