【问题标题】:How to Parse XML in PHP with simplexmlelement?如何使用 simplexmlelement 在 PHP 中解析 XML?
【发布时间】:2015-08-04 05:49:47
【问题描述】:

我正在尝试使用 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 中没有 &lt;BuyersOrderNumber&gt;

标签: php xml parsing


【解决方案1】:

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

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

我试过你的代码,你做得很好!只需 (string) 就足以让脚本运行。

【讨论】:

  • 谢谢。请能够帮助我的另一部分。文件中有多个 我不明白如何遍历每一个并获取我需要的信息。
  • 您实际上总是可以使用foreach ($someParentNode as $someChildNode) { ... } 循环遍历simplexml 对象,因此您只需找到行的位置并foreach 即可。
【解决方案2】:

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

【讨论】:

  • 感谢您的帮助。我正在尝试使用它,但是当我执行 $children->nodeValue 时,它​​正在获取 中所有节点的值。我厌倦了做类似 $children->BuyersOrderNumber->nodeValue 的事情,但这给了我错误。如何分别获取特定节点的值。
  • 如果我理解,您只想获得“BuyersOrderNumber”值。我认为一个好的解决方案可能是递归函数。如果你想获得 child->child->value,比如 BuyersOrderNumber,告诉我,我会发布一个代码,其中的答案似乎我是正确的
  • 是的,这就是我需要的,因为我在这个文件中也有多个订单行,但我只需要获取特定的值。一直想学 DOM 再次感谢。
【解决方案3】:

DOMDocumentrecursive 函数似乎我正在努力获得这个值。

$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(),得到你想要的值

【讨论】:

  • 谢谢,我现在将尝试在我的脚本中使用此登录。
  • 希望对你有用:)
【解决方案4】:

更简单的方法

检索多个&lt;BuyersOrderNumber&gt;

使用xpath:

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

解释:

  • xpath 语句将选择任何&lt;BuyersOrderNumber&gt;
  • XML 树中的任何位置(由于节点名称前有//
  • $numbers 将包含 SimpleXML 元素的数组

输出所有节点:

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

检索一个&lt;BuyersOrderNumber&gt;节点

  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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多