首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleXML循环

SimpleXML循环
EN

Stack Overflow用户
提问于 2021-09-25 08:57:47
回答 2查看 50关注 0票数 1

我通过这样的xml获取产品数据。

代码语言:javascript
复制
    <?xml version='1.0' encoding='UTF-8'?>
    <brands>
        <brand>
            <name>Spielberger Mühle</name>
            <kuerzel>SPI</kuerzel>
            <id>e3124594-1d4c-4a72-8c66-37de394fece2</id>
            <last_modified>27.04.2021 23:00:03</last_modified>
            <logo>
                <id>e3124594-1d4c-4a72-8c66-37de394fece2</id>
                <name>SPI_Spielberger Mühle_e3124594-1d4c-4a72-8c66-37de394fece2.jpg</name>
                <size>273981</size>
                <mime_type>image/jpeg</mime_type>
                <img_width>1533</img_width>
                <img_height>676</img_height>
                <last_modified>13.12.2016 12:48:02</last_modified>
            </logo>
            <url>www.spielberger-muehle.de</url>
            <adr_invb_name>Spielberger GmbH</adr_invb_name>
            <adr_invb_strasse>Burgermühle</adr_invb_strasse>
            <adr_invb_plz>74336</adr_invb_plz>
            <adr_invb_ort>Brackenheim</adr_invb_ort>
            <adr_invb_land_id>8</adr_invb_land_id>
        </brand>
    </brands>
    <producers>
        <producer>
 ....

和我的php (缩写为相关部分)

代码语言:javascript
复制
    $xml = simplexml_load_file('demo.xml');

    foreach ($xml->brands->brand as $key => $value) {

        print "Key: $key - Value: $value\n";

    }

如果我试图遍历这个品牌,就会发生以下情况

代码语言:javascript
复制
 Key: brand - Value: 

编辑是因为我觉得我很会长篇大论。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-25 09:49:14

之所以会发生这种情况,是因为SimpleXMLElement如何处理它的迭代器。可以使用get_object_vars函数迭代元素。

代码语言:javascript
复制
foreach (get_object_vars($xml) as $key => $value) {
    print "Key: $key - Value: $value\n";
}
票数 1
EN

Stack Overflow用户

发布于 2021-09-25 11:12:36

请记住,SimpleXML做而不是会给您数组;问题中的所有输出都是对象,理解这些特定对象是如何工作的是关键。

特别是,该对象的设计允许您在具有相同名称的多个节点上进行迭代。在特定情况下,只有一个<brand>元素,但是库仍然允许循环,以防有时不止一个:

代码语言:javascript
复制
foreach ( $xml->brands->brand as $brandElement )

这是您意外编写的循环;它只循环一次,因为有一个匹配的元素,关键是"brand",因为这是该元素的名称。您想要的实际对象是循环中的值。

因为您知道在您的情况下总是有一个匹配的元素,所以可以直接请求第一个元素:

代码语言:javascript
复制
$brandElement = $xml->brands->brand[0];

如果您访问元素的子元素,这也是隐含的:

代码语言:javascript
复制
$brandName = $xml->brands->brand->name;
// short for $xml->brands[0]->brand[0]->name

最后,可以使用->children()显式地获取元素的所有子元素的列表。

代码语言:javascript
复制
foreach ( $xml->brands->brand->children() as $name => $element )
// equivalent to foreach ( $xml->brands[0]->brand->children() as $name => $element )
// or foreach ( $xml->brands->brand[0] as $name => $element )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69324625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档