使从ZOHO XML文件

问题描述:

密钥=>数组值我有此XML文件,并基本上我希望能够构建阵列[]key=>value使从ZOHO XML文件

[0]['Product Id']=>productId_1, 
[0]['Product Name']=>product_name_1... 
[1]['Product Id']=>productId_2, 
[1]['Product Name']=>product_name_2 

等。我试过simplexml_load_file,并努力到达节点(getName(),attributes()),但都没有成功。 A print_r($obj)显示了FL下的编号数组,我可以访问该数组,但我需要名称(“产品ID”)以及值。我做不到。我对XML一点也不熟悉,请问有人能给我一点帮助吗?在2天的搜索中找不到任何与我的问题相匹配的内容。希望我正确解释自己。

<Invoices> 
    <row num="1"> 
     <FL val="Product Details"> 
      <product no="1"> 
       <FL val="Product Id">productId_1</FL> 
       <FL val="Product Name">product_name_1</FL> 
       <FL val="Quantity">1</FL> 
       <FL val="List Price">1.00</FL> 
       <FL val="Discount">0</FL> 
       <FL val="Total">1.00</FL> 
       <FL val="Total After Discount">1.00</FL> 
       <FL val="Tax">0</FL> 
       <FL val="Net Total">1.00</FL> 
      </product> 
     </FL> 
    </row> 
    <row num="...."> 
    </row> 
</Invoices> 

让我们来看看它是如何工作SimpleXML中:

<FL val="Product Id">productId_1</FL> 
 ^^^    ^^^ 
     |    | 
"val" attribute   | 
        <FL> element 

比方说,这个XML <FL> - 元素将被存储在变量$FL,然后你可以用$FL['val']

  • ... <FL>元素值访问...

    • ... “val” 属性值直接与$FL联系。

    要将其放入数组中,将值转换为字符串非常重要。我用的是trim功能,铸造串(string)会工作,太:

    $array = array(); 
    $key = trim($FL['val']); 
    $value = trim($FL); 
    $array[$key] = $value; 
    

    示范$array则是:

    Array 
    (
        [Product Id] => productId_1 
    ) 
    

    所以现在在XML有中的多个<FL> -elements <product> -elements。假设$product将是第一个产品元素。从上面只有不拘一格一个foreach循环内对所有<FL> -elements包裹:

    $array = array(); 
    foreach ($product->FL as $FL) { 
        $key = trim($FL['val']); 
        $value = trim($FL); 
        $array[$key] = $value; 
    } 
    

    示范$array则是:

    Array 
    (
        [Product Id] => productId_1 
        [Product Name] => product_name_1 
        [Quantity] => 1 
        [List Price] => 1.00 
        [Discount] => 0 
        [Total] => 1.00 
        [Total After Discount] => 1.00 
        [Tax] => 0 
        [Net Total] => 1.00 
    ) 
    

    现在终于你只需要转换的所有产品。因为它适用于所有的产品,因为它适用于一个产品,你可以把逻辑放到它的功能自己:

    function product(SimpleXMLElement $product) 
    { 
        $array = array(); 
        foreach ($product->FL as $FL) { 
         $key   = trim($FL['val']); 
         $value  = trim($FL); 
         $array[$key] = $value; 
        } 
        return $array; 
    } 
    

    然后可以使用XPath查询来获取所有的产品元素,并做了映射:

    然后
    $xml = simplexml_load_string($buffer); 
    
    $result = array_map('product', $xml->xpath('//product')); 
    

    输出是:

    Array 
    (
        [0] => Array 
         (
          [Product Id] => productId_1 
          [Product Name] => product_name_1 
          [Quantity] => 1 
          [List Price] => 1.00 
          [Discount] => 0 
          [Total] => 1.00 
          [Total After Discount] => 1.00 
          [Tax] => 0 
          [Net Total] => 1.00 
         ) 
    
    ) 
    

    我希望这一点更清晰为你做的事情。

    这里的例子在全:

    <?php 
    /** 
    * Make key=>value array from zoho XML file 
    * @link http://*.com/a/29461013/367456 
    */ 
    
    $buffer = <<<XML 
    <Invoices> 
        <row num="1"> 
         <FL val="Product Details"> 
          <product no="1"> 
           <FL val="Product Id">productId_1</FL> 
           <FL val="Product Name">product_name_1</FL> 
           <FL val="Quantity">1</FL> 
           <FL val="List Price">1.00</FL> 
           <FL val="Discount">0</FL> 
           <FL val="Total">1.00</FL> 
           <FL val="Total After Discount">1.00</FL> 
           <FL val="Tax">0</FL> 
           <FL val="Net Total">1.00</FL> 
          </product> 
         </FL> 
        </row> 
        <row num="...."> 
        </row> 
    </Invoices> 
    XML; 
    
    function product(SimpleXMLElement $product) 
    { 
        $array = array(); 
        foreach ($product->FL as $FL) { 
         $key   = trim($FL['val']); 
         $value  = trim($FL); 
         $array[$key] = $value; 
        } 
        return $array; 
    } 
    
    $xml = simplexml_load_string($buffer); 
    
    $result = array_map('product', $xml->xpath('//product')); 
    
    print_r($result); 
    
  • +0

    非常整齐的代码和清晰的“一步一步”解释。我现在知道更多关于处理Xml的信息。它的作品非常漂亮。非常感谢。麦克风 – michael 2015-04-05 20:19:09

    使用DOMDocument一些DOMXPath查询相结合:

    $source = <<<EOS 
         <Invoices> 
         <row num="1"> 
          <FL val="Product Details"> 
           <product no="1"> 
            <FL val="Product Id">productId_1</FL> 
            <FL val="Product Name">product_name_1</FL> 
            <FL val="Quantity">1</FL> 
            <FL val="List Price">1.00</FL> 
            <FL val="Discount">0</FL> 
            <FL val="Total">1.00</FL> 
            <FL val="Total After Discount">1.00</FL> 
            <FL val="Tax">0</FL> 
            <FL val="Net Total">1.00</FL> 
           </product> 
          </FL> 
         </row> 
         <row num="2"> 
          <FL val="Product Details"> 
           <product no="2"> 
            <FL val="Product Id">productId_2</FL> 
            <FL val="Product Name">product_name_2</FL> 
            <FL val="Quantity">2</FL> 
            <FL val="List Price">2.00</FL> 
            <FL val="Discount">0</FL> 
            <FL val="Total">2.00</FL> 
            <FL val="Total After Discount">2.00</FL> 
            <FL val="Tax">0</FL> 
            <FL val="Net Total">2.00</FL> 
           </product> 
          </FL> 
         </row> 
        </Invoices> 
    EOS; 
    
    $dom = new DOMDocument(); 
    $dom->loadXML($source); 
    
    $xpath = new DOMXPath($dom); 
    $products = $xpath->query('//product'); 
    
    foreach ($products as $product) { 
        $fls = $xpath->query('.//FL', $product); 
        $row = []; 
        foreach ($fls as $fl) { 
         $row[$fl->getAttribute('val')] = $fl->nodeValue; 
        } 
        $result[] = $row; 
    } 
    
    print_r($result); 
    

    输出:

    Array 
    (
        [0] => Array 
         (
          [Product Id] => productId_1 
          [Product Name] => product_name_1 
          [Quantity] => 1 
          [List Price] => 1.00 
          [Discount] => 0 
          [Total] => 1.00 
          [Total After Discount] => 1.00 
          [Tax] => 0 
          [Net Total] => 1.00 
         ) 
    
        [1] => Array 
         (
          [Product Id] => productId_2 
          [Product Name] => product_name_2 
          [Quantity] => 2 
          [List Price] => 2.00 
          [Discount] => 0 
          [Total] => 2.00 
          [Total After Discount] => 2.00 
          [Tax] => 0 
          [Net Total] => 2.00 
         ) 
    ) 
    
    +0

    谢谢回复。麦克风。 – michael 2015-04-05 20:39:32

    +0

    不客气:) – mhall 2015-04-06 08:39:54