PHP:从XML集合中只获得1个结果

时间:2016-01-22 15:40:27

标签: php xml loops foreach

我试图用PHP读取XML文件,但我只得到第一个结果而无法弄清楚原因。

XML结构:

<main>
  <data>
   <record>
    <column name="title">Some title here</column>
   </record>
   <record>
    <column name="title">Some second title here</column>
   </record>
  </data>
</main>

非常基本。这是我用来获得结果的代码:

foreach($XML->data->record as $product) {
  $title = mysql_real_escape_string($product->title);
}

但这只会给出一个空字符串,所以我想我正在寻找错误的路径。下面的代码确实有效,但只给出了第一条记录而不是XML文件中的其他记录。

foreach($XML->data as $product) {
  $title = mysql_real_escape_string($product->record->title);
}

答案可能很简单,但我无法弄清楚。希望有人愿意帮忙:)。

2 个答案:

答案 0 :(得分:2)

titlename节点的<column> 属性的值。
您无法以此方式访问它。

访问<column>节点:

$xml = simplexml_load_string($x); // assume XML in $x

foreach ($xml->data->record as $product) {
    echo $product->column;
}

输出:

Some title here
Some second title here

看到它有效:https://eval.in/506519

如果每条记录下有很多列......

<record>
    <column name="title">Some title here</column>
    <column name="car">BMW</column>
    <column name="color">red</column>
</record>

...你要列出所有,你需要第二个循环:

foreach ($xml->data->record as $product) {  // same as above
    foreach ($product->column as $column) { // iterate all column 
        echo $column['name'] . ": " . $column . PHP_EOL;
    }
}

输出:

title: Some title here
car: BMW
color: red

看到它有效:https://eval.in/506521

如果您只想<column>name = "title"个节点,请查看if

foreach ($xml->data->record as $product) {  // same as above
    foreach ($product->column as $column) { // iterate all column 
        if ($column['name'] == "title") echo $column . PHP_EOL;
    }
}

看到它有效:https://eval.in/506523

请注意,使用<column> name = "title"获取所有xpath的方式不同:

$titles = $xml->xpath("//column[@name = 'title']");
foreach ($titles as $title)
    echo $title . PHP_EOL;

在行动中看到它:https://eval.in/506531

有关xpath语法的说明,请查看Using xPath to access values of simpleXML和其他数据。

和BTW:如评论中所述,请勿使用mysql_ ...

答案 1 :(得分:0)

未经测试但看起来不错。将xml文件/字符串加载到DOMDocument中并获取所有column个节点并迭代它们

$dom=new DOMDocument;
$dom->loadXML( $strxml );
/*
    or
    --
$dom->load( $xmlfile );
*/

$col=$dom->getElementsByTagName('column');
foreach( $col as $node ){
    echo $node->tagName.' '.$node->getAttribute('title').' '.$node->nodeValue;
}