来自xml的属性值

时间:2015-10-21 07:16:27

标签: php xml attributes

我使用以下代码读取xml文件

$xml = file_get_contents('file.xml');<br>
include('xml_lib.php');<br>
$data = XML_unserialize($xml);<br>
$i = 0;<br>
foreach ($data[ordersetChangeReport][tradeItem] as $value) {<br>
    $productNumber = $data[ordersetChangeReport][tradeItem][$i][sfgItemNumber];<br>
    $gewichtProduct = $data[ordersetChangeReport][tradeItem][$i][sfgTotalNetVolume];<br>
    $metadata = array(<br>
        'gewichtProduct' => $gewichtProduct,<br>
    );<br>
    foreach ($metadata as $meta_key => $metavalue) {<br>
        update_post_meta($productNumber, $meta_key, $metavalue);<br>
    }<br>
    $i++;<br>
}

我的问题:如何获得attrubute值&#34; unitOfMeasure&#34;来自现场&#34; sfgTotalNetVolume&#34;?

非常感谢提前。

3 个答案:

答案 0 :(得分:1)

您正在使用一些以通用方式将XML转换为数组的库。这通常是一个坏主意,因为它意味着丢失信息并直接依赖于输入XML结构。

使用Xpath直接使用DOM扩展并不困难:

$xml = <<<'XML'
<ordersetChangeReport> <tradeItem> <sfgItemNumber>196306</sfgItemNumber> <sfgTotalNetVolume unitOfMeasure="LT">1.00000</sfgTotalNetVolume> </tradeItem> <tradeItem> <sfgItemNumber>674892</sfgItemNumber> <sfgTotalNetVolume unitOfMeasure="KG">1.50000</sfgTotalNetVolume> </tradeItem> </ordersetChangeReport>
XML;

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate('/ordersetChangeReport/tradeItem') as $item) {
  var_dump(
    [
       'number' => $xpath->evaluate('string(sfgItemNumber)', $item),
       'volume' => [
         'value'=> $xpath->evaluate('number(sfgTotalNetVolume)', $item),
         'unit'=> $xpath->evaluate('string(sfgTotalNetVolume/@unitOfMeasure)', $item)
       ]
    ]
  );
}

输出:

array(2) {
  ["number"]=>
  string(6) "196306"
  ["volume"]=>
  array(2) {
    ["value"]=>
    float(1)
    ["unit"]=>
    string(2) "LT"
  }
}
array(2) {
  ["number"]=>
  string(6) "674892"
  ["volume"]=>
  array(2) {
    ["value"]=>
    float(1.5)
    ["unit"]=>
    string(2) "KG"
  }
}

答案 1 :(得分:0)

好的,现在这有点复杂,因为您使用的是库和xml文件,我不知道。但是,我想出了一个使用内置SimpleXML class的小解决方案。

这是如何访问属性的基本示例,您需要编写一些迭代代码;)

我们走了:

  function f(){
             var continued=document.getElementById("Form:testID").value;
             if(continued==="true"){
                 PF('dialogWidgetVar').show();
             }
        }
 window.addEventListener('beforeunload', f(), true);

使用<?php $xml_string = '<ordersetChangeReport> <tradeItem> <sfgItemNumber>196306</sfgItemNumber> <sfgTotalNetVolume unitOfMeasure="LT">1.00000</sfgTotalNetVolume> </tradeItem> <tradeItem> <sfgItemNumber>674892</sfgItemNumber> <sfgTotalNetVolume unitOfMeasure="KG">1.50000</sfgTotalNetVolume> </tradeItem> </ordersetChangeReport>'; $xml = simplexml_load_string($xml_string); $unitOfMeasure = $xml->tradeItem->sfgTotalNetVolume->attributes()->unitOfMeasure; echo $unitOfMeasure; ?> 查看整个树。请记住,并非所有属性都会显示,因此您需要在子项上使用print_r,例如

print_r($xml);

编辑:小信息:

变量print_r($xml->tradeItem->sfgTotalNetVolume);不是字符串类型变量,而是$unitOfMeasure。您仍然可以像字符串一样访问它,因为它实现了SimpleXMLElement Object - 方法

答案 2 :(得分:0)

非常感谢你们快速和快速的内容丰富的答案。

我需要知道的规则正是:

$xml->tradeItem->sfgTotalNetVolume->attributes()->unitOfMeasure;

它就像一个魅力。