我试图用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);
}
答案可能很简单,但我无法弄清楚。希望有人愿意帮忙:)。
答案 0 :(得分:2)
title
是name
节点的<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;
}