【问题标题】:PHP: getting only 1 result from XML collectionPHP:从 XML 集合中只得到 1 个结果
【发布时间】:2016-04-29 06:35:33
【问题描述】:

我正在尝试使用 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);
}

答案可能很简单,但我想不通。希望有人愿意提供帮助:)

【问题讨论】:

  • 如何在代码中将 xml 文件加载到 $XML?
  • SURE 这是一个空字符串,不是布尔值 false?您必须连接到 mysql 才能使用该功能,并且整个 mysql_*() 功能集无论如何都已过时。您不应该在任何新代码中使用它。

标签: php xml loops foreach


【解决方案1】:

未经测试,但看起来不错。将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;
}

【讨论】:

    【解决方案2】:

    title&lt;column&gt; 节点的name 属性 的值。
    您无法以您的方式访问它。

    访问&lt;column&gt; 节点:

    $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

    如果您只需要带有name = "title"&lt;column&gt; 节点,请使用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

    请注意,有一种不同的方法可以获取所有 &lt;column&gt;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 和无数其他语法。

    顺便说一句:正如 cmets 所说,不要使用 mysql_...

    【讨论】:

    • 它适用于第二个循环并检查列名,谢谢!
    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    相关资源
    最近更新 更多