【问题标题】:php xml xpath foreach to get values of nodes with same namephp xml xpath foreach 获取具有相同名称的节点的值
【发布时间】:2016-07-25 13:31:44
【问题描述】:

伙计们,

我有这个 xml 代码:

<items>
<item type="boardgame" id="84876">
<versions>
<item type="boardgameversion" id="317166">
<link type="boardgameversion" id="84876" value="The Castles of Burgundy" inbound="true"/>
<name type="primary" sortindex="1" value="Chinese Edition"/>
<link type="boardgamepublisher" id="9068" value="Broadway Toys LTD"/>
<link type="language" id="2181" value="Chinese"/>
</item>

<item type="boardgameversion" id="269360">
<link type="boardgameversion" id="84876" value="The Castles of Burgundy" inbound="true"/>
<name type="primary" sortindex="1" value="Hobby World Russian first edition"/>
<link type="boardgamepublisher" id="18852" value="Hobby World"/>
<link type="boardgameartist" id="11886" value="Julien Delval"/>
<link type="boardgameartist" id="4959" value="Harald Lieske"/>
<link type="language" id="2202" value="Russian"/>
</item>

<item type="boardgameversion" id="141049">
<link type="boardgameversion" id="84876" value="The Castles of Burgundy" inbound="true"/>
<name type="primary" sortindex="1" value="Ravensburger English/French Edition"/>
<link type="boardgamepublisher" id="9" value="alea"/>
<link type="boardgamepublisher" id="34" value="Ravensburger Spieleverlag GmbH"/>
<link type="boardgameartist" id="11886" value="Julien Delval"/>
<link type="boardgameartist" id="4959" value="Harald Lieske"/>
<link type="language" id="2184" value="English"/>
<link type="language" id="2187" value="French"/>
</item>

<item type="boardgameversion" id="69303">
<link type="boardgameversion" id="84876" value="The Castles of Burgundy" inbound="true"/>
<name type="primary" sortindex="1" value="Ravensburger Multilingual First Edition"/>
<link type="boardgamepublisher" id="9" value="alea"/>
<link type="boardgamepublisher" id="34" value="Ravensburger Spieleverlag GmbH"/>
<link type="boardgameartist" id="11886" value="Julien Delval"/>
<link type="boardgameartist" id="4959" value="Harald Lieske"/>
<link type="language" id="2184" value="English"/>
<link type="language" id="2187" value="French"/>
<link type="language" id="2188" value="German"/>
</item>

<item type="boardgameversion" id="134173">
<link type="boardgameversion" id="84876" value="The Castles of Burgundy" inbound="true"/>
<name type="primary" sortindex="1" value="Ravensburger Multilingual Second Edition"/>
<link type="boardgamepublisher" id="9" value="alea"/>
<link type="boardgamepublisher" id="34" value="Ravensburger Spieleverlag GmbH"/>
<link type="boardgameartist" id="11886" value="Julien Delval"/>
<link type="boardgameartist" id="4959" value="Harald Lieske"/>
<link type="language" id="2184" value="English"/>
<link type="language" id="2187" value="French"/>
<link type="language" id="2188" value="German"/>
</item>
</versions>
</item>
</items>

我想为每个版本项获取&lt;link type="language"...&gt; 的值。

我的php代码是:

$language = $xmlinfo2->item->versions->item;
$lang = $language->xpath('//link[@type="language"]');
$num = 1;

    foreach($language as $lang1) {
       echo $num . ". ";
         foreach ($lang as $lang2){
           $lang3 = $lang2->attributes();
           echo $lang3['value'] . ", ";
         }
         echo "<br>";
         $num++;
    }

它的结果是(它写出了所有版本的所有语言):

  1. 中文、俄文、英文、法文、英文、法文、德文、英文、法文、德文、

  2. 中文、俄文、英文、法文、英文、法文、德文、英文、法文、德文、

  3. 中文、俄文、英文、法文、英文、法文、德文、英文、法文、德文、

  4. 中文、俄文、英文、法文、英文、法文、德文、英文、法文、德文、

  5. 中文、俄文、英文、法文、英文、法文、德文、英文、法文、德文、

如何更改我的 php 代码才能获得此结果?

  1. 中文

  2. 俄语

  3. 英语、法语

  4. 英语、法语、德语

  5. 英语、法语、德语

感谢您的帮助!

【问题讨论】:

    标签: php xml xpath foreach


    【解决方案1】:

    这里有几个问题:

    1) 在 xpath 选择器的开头使用 // 意味着从文档中的 anywhere 获取这些元素。因此,每次循环时,您都会得到所有项目中所有语言的列表。

    2) 您的xpath() 调用必须在循环内,否则它在您正在查看的当前&lt;item&gt; 的上下文中不起作用。

    所以你可以使用类似的东西:

    foreach ($language as $lang1) {
        $lang = $lang1->xpath('link[@type="language"]');
    
        echo $num . ". ";
    
        foreach ($lang as $lang2){
            $lang3 = $lang2->attributes();
            echo $lang3['value'] . ", ";
        }
    
        echo "<br>";
        $num++;
    }
    

    【讨论】:

    • 效果很好。感谢您的代码和您的描述!祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多