【问题标题】:simplexml get value not all attributessimplexml 获取值不是所有属性
【发布时间】:2016-05-01 11:58:29
【问题描述】:

我对 php 不是很熟悉(刚开始学习),我有一个问题: 我在服务器上有一个 xml 文件(从前夕......但谁在乎),我管理它来“读取”这个文件。它的结构是这样的:

<result>
     <rowset>
          <row name="abc" id="def" ...>
          <row name="abc" id="def" ...>
          <row name="abc" id="def" ...>
          ...
     </rowset>
</result>

搜索一些网页,我找到了一种回显所有行的所有属性的方法。 这是我的代码:

<?php
$url = "http://api.eveonline.com/eve/AllianceList.xml.aspx?version=1";

$xml = simplexml_load_file($url);

$nrOfRows = $xml->result[0]->rowset[0]->count();
$n = 0;

for ($n = 0; $n <= $nrOfRows; $n++) {
    foreach($xml->result[0]->rowset[0]->row[$n]->attributes() as $a => $b) {
        echo $a, " = ", $b, "<br>";
    }
}
?>

结果我得到:

name = abc
id = def
...
name = abc
id = def
...

这看起来不错,但这不是我想要的。 我只需要所有行的特殊属性。例如,我想要所有行的所有名称作为结果。

感谢您的帮助。 沙里尔

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    您可以使用数组语法来访问单个属性:

    echo $xml->result[0]->rowset[0]->row[$n]['name'];
    

    将输出:

    Goonswarm Federation
    Pandemic Horde
    Test Alliance Please Ignore
    (...)
    

    另请注意,您可以通过这种方式简化代码:

    foreach( $xml->result[0]->rowset[0]->row as $row )
    {
        echo $row['name'] . '<br>';
    }
    

    【讨论】:

    • 非常感谢! “回声 $xml->result[0]->rowset[0]->row[$n]['name'];”正是我想要的:) 并且简化循环是个好主意
    【解决方案2】:

    这是一个使用 DOMDocumentDOMXpath 类中的构建的示例

    $xml = <<< LOL
    <result>
         <rowset>
              <row name="abc" id="def" lang="pt">Olá</row>
              <row name="abc" id="def" lang="en">Hello</row>
              <row name="abc" id="def" lang="fr">Bonjour</row>
         </rowset>
    </result>
    LOL;
    
    $dom = new DOMDocument();
    libxml_use_internal_errors(true);
    $dom->loadXML($xml);
    $xpath = new DOMXpath($dom);
    foreach ($xpath->query("//row") as $row){
        echo $row->getAttribute('name');
        echo $row->getAttribute('id');
        echo $row->getAttribute('lang');
        echo $row->textContent;
    }
    

    上面的示例将获取每个行元素的nameidlang 属性和文本text

    Ideone Demo


    如果您需要按idclass 过滤行,请使用;

    $xpath->query("//row[@class='someClass']")
    $xpath->query("//row[@id='someId']")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 2018-08-04
      • 2012-05-19
      • 1970-01-01
      • 2012-10-03
      • 2017-03-14
      • 1970-01-01
      相关资源
      最近更新 更多