用php和simplexml读取XML文件

时间:2014-03-27 10:22:46

标签: php xml

另外一个n00b:)

我有一个看起来像这样的xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE BPS SYSTEM "bpml.dtd">
<BPS Created="2012-04-24 11:40:41">
<Machine SerialNumber="" Site="" SoftwareRelease="MAP_248204031" VersionInfo="" Name="" Type="BPS200">
<ParameterSection Number="6" StartTime="2012-04-24 11:23:01" EndTime="1970-01-01 00:00:00">
<Operator></Operator>
<HeadercardUnit HeaderCardID="1706539" DepositID="01706539" StartTime="2012-04-24 11:39:57" MilliSec="0" EndTime="2012-04-24 11:40:40" Rejects="NO">
<Counter Currency="HRK" DenomID="22550" Value="200" Quality="Fit" Output="Stacked" Number="192"></Counter>
<Counter Currency="HRK" DenomID="22550" Value="200" Quality="Unfit" Output="Stacked" Number="7"></Counter>
</HeadercardUnit>
</ParameterSection>
</Machine>
</BPS>

我需要将值放到mysql db中,但我不知道如何从该xml中读取嵌套值。

这是我到目前为止所做的只是为了看看发生了什么:

$xml = @simplexml_load_file($filename);
if ($xml !== FALSE) {
    $row[] = $xml->Machine->ParameterSection->HeadercardUnit; // tried to throw values in the array - no go
    foreach ($row as $item) {
        echo 'item: ' . $item . "<br>";
    }
}

但这不起作用。

这是我的插入声明:

INSERT INTO counttable (DenomID, Quality, Number, headercard) VALUES (22550, 'Fit', 192, 1706539)

可能使用XML的关联数组值。像这样的东西

$count = array('HeaderCardID'='1706539', 'DenomID'='22550', 'Quality'='Fit', 'Number'='192')

然后:

INSERT INTO counttable (DenomID, Quality, Number, headercard) VALUES ('$count[1]', '$count[2]', '$count[3]', '$count[0]')
对于xml中的每个Counter行,

等等。它可以是单个xml中的许多Counter行。

2 个答案:

答案 0 :(得分:1)

尝试以下方法:

<?php
$xml = @simplexml_load_file('asd.xml');
if ($xml !== FALSE) {
    foreach ($xml as $key => $item) {
        foreach($item->attributes() as $attr => $val){
            print_r($val);
        }
    }
}
?>

根据您的需要进行调整。

$key是&#34; element2&#34;和&#34; element3&#34 ;;

$item是元素本身;

$attr是keyXY(例如key21,key22);

$val是属性valueXY的值(例如value21,value22)。

答案 1 :(得分:1)

如果节点存在,不进行任何额外检查,我相信这应该是它。

诀窍是获取HeadercardUnit的子代并迭代它们。然后,您可以获取每个Counter元素的属性。属性有一个名称,但该值是PHP SimpleXMLElement实例。为了得到一个好的值,我们将它转​​换为字符串。

你最终会得到一个阵列数组。其中每一个都可以保存在数据库中。

 $xml = @simplexml_load_file($filename);    
 $to_save_array = [];

 if($xml)
 {
    // looping all children, assumed it always exists
    foreach($xml->Machine->ParameterSection->HeadercardUnit->children() as $counter)
    {
        // data of this Counter record
        $record_data = [];

        // getting the attributes
        foreach($counter->attributes() as $name => $value)
        {
            // casting a SimpleXMLElement to string yields the text value of the node
            $record_data[$name] = (string)$value;
        }

        $to_save_array[] = $record_data;
    }
}

var_dump($to_save_array);

希望有所帮助