如何在PHP中解析XML

时间:2015-05-22 09:11:37

标签: php xml parsing

大家好我正在尝试使用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>

这是我第一次使用xml我真的很感激,如果有人能提供帮助的话。谢谢。

4 个答案:

答案 0 :(得分:0)

如果将对象强制转换为字符串,它将使用其值并将其转换为:

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

我尝试了你的代码,你做得很好!只需(string)即可让脚本运行。

答案 1 :(得分:0)

我建议你使用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获取节点的值。

答案 2 :(得分:0)

DOMDocument 递归函数似乎正在努力获取此值。

Click to Add

如果当前节点中有子节点,它将再次对子节点调用parse(),并且您将获得值yu want

答案 3 :(得分:0)

更容易

检索多个<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]

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

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

    $xml = simplexml_load_file($local_file_path);
    

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