【问题标题】:Get nested xml element with php使用 php 获取嵌套的 xml 元素
【发布时间】:2017-10-11 20:53:02
【问题描述】:

我现在正在尝试几天,但我找不到正确的代码..我很绝望,所以我希望有人能帮助我..

这是我的 XML 代码:

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="repo.name" name="Repo name" version="1.1.0.1" provider-name="provider name">
    <extension point="xbmc.addon.repository" name="repo name">
        <info compressed="false">http://data.com/addons.xml</info>
        <checksum>http://data.com/addons.xml.md5</checksum>
        <datadir zip="true">http://data.com/files</datadir>
    </extension>
    <extension point="xbmc.addon.metadata">
    <description lang="en">bla bla</description>
    <disclaimer lang="en">bla 2 bla 2</disclaimer>
    <language></language>
    <platform>all</platform>
    <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
 </extension>
</addon>

我如何在 PHP 中获得以下值:

<extension point="xbmc.addon.metadata">
       <description lang="en">bla bla</description> <---- This one

我尝试了诸如 foreach 循环和 xpath 之类的东西,但没有什么能让我得到字符串:“bla bla”

 foreach ($success->summary as $success2) {

                         echo $success2['lang'];

             foreach ($success2->attributes()['lang'] as $success3) {


                 print_r($success3->summary);


foreach($xml->xpath('extension/@point') as $link) { echo $link['platform']; echo "\n"; }

我希望有人可以帮助我,这样我就可以完成我的小项目

编辑:

感谢@Mega6382 的帮助。

但是当我尝试从描述中获取多种语言时,它不会起作用:

XML 就像:

   <extension point="xbmc.addon.metadata">
        <description lang="en">en bla bla</description>

    <description lang="nl">Dutch desc</description>
    <description lang="be">English desc</description>
    <description>Standard desc</description>

 </extension>

但是当我尝试使用荷兰语和英语 lang 时,我只会得到英文描述(当我将 nl 移到 en 上方时,我只会得到 nl 描述..)

php代码:

<?php   

$xml = simplexml_load_string ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="repo.name" name="Repo name" version="1.1.0.1" provider-name="provider name">
    <extension point="xbmc.addon.repository" name="repo name">
        <info compressed="false">http://data.com/addons.xml</info>
        <checksum>http://data.com/addons.xml.md5</checksum>
        <datadir zip="true">http://data.com/files</datadir>
    </extension>
    <extension point="xbmc.addon.metadata">
        <description lang="en">en bla bla</description>

    <description lang="nl">Dutch desc</description>
    <description lang="de">German desc</description>
    <description>Standard desc</description>

 </extension>
</addon>');

foreach($xml->extension as $extension)
{
    if(isset($extension->description))
    {
        if($extension->description['lang'] == 'en')
        {
            echo $extension->description;
        }
        if($extension->description['lang'] == 'nl')
        {
            echo $extension->description;
        }

    }
}




            ?>

【问题讨论】:

  • 你能把你试过的东西贴出来吗
  • 我删除了其余的,我尝试的最后一件事:foreach($xml-&gt;xpath('extension/@point') as $link) { echo $link['platform']; echo "\n"; } 但我什至不会得到平台的价值..
  • @Arjanth 只需删除 continue; 即可。
  • @mega6382 nop.. 还是不行。

标签: php xml xpath


【解决方案1】:

尝试以下方法:

$xml = simplexml_load_string ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="repo.name" name="Repo name" version="1.1.0.1" provider-name="provider name">
    <extension point="xbmc.addon.repository" name="repo name">
        <info compressed="false">http://data.com/addons.xml</info>
        <checksum>http://data.com/addons.xml.md5</checksum>
        <datadir zip="true">http://data.com/files</datadir>
    </extension>
    <extension point="xbmc.addon.metadata">
    <description lang="en">bla bla</description>
    <disclaimer lang="en">bla 2 bla 2</disclaimer>
    <language></language>
    <platform>all</platform>
    <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
 </extension>
</addon>');

$description = [];
$descriptionEng = null;
foreach($xml->extension as $extension)
{
    if(isset($extension->description))
    {
        if($extension->description['lang'] == 'en')
        {
            $descriptionEng = $extension->description;
            continue;
        }
        $description[] = $extension->description;
    }
}

var_dump($description);

这将遍历所有&lt;extension&gt; 标签,并将检查&lt;description&gt; 标签并将其存储在$description 数组中。您可以通过print_r($description[0])

之类的方式访问其中一个

编辑: $descriptionEng 将包含带有lang=en&lt;description&gt; 标签,而$description 将包含其余标签。

编辑 2: 尝试以下方法从同一扩展中获取描述。

$descriptionEng = null;
$descriptionDe = null;
$descriptionNl = null;
foreach($xml->extension as $extension)
{
    if(isset($extension->description))
    {
        foreach($extension->description as $description)
        {
            if($description['lang'] == 'en')
            {
                $descriptionEng = $description;
            }
            elseif($description['lang'] == 'de')
            {
                $descriptionDe = $description;
                continue;
            }
            elseif($description['lang'] == 'nl')
            {
                $descriptionNl = $description;
            }
        }
    }
}

【讨论】:

  • 谢谢!哇,这行得通...您现在是否也仅获取 lang=en 描述。如果 lang=en 不存在,请使用没有 lang 的描述:bla bla
  • 谢谢! @Mega6382 +1
  • 一件事:` if($extension->description['lang'] == 'en') { $descriptionEng = $extension->description;继续; } if($extension->description['lang'] == 'nl') { $descriptionNl = $extension->description;继续; }` 为什么我不能保存多个语言?
  • object(SimpleXMLElement)#5 (0) { } object(SimpleXMLElement)#4 (5) { ["@attributes"]=&gt; array(1) { ["lang"]=&gt; string(2) "en" } [0]=&gt; string(10) "en bla bla" [1]=&gt; string(10) "nl bla bla" [2]=&gt; string(10) "en bla bla" [3]=&gt; string(10) "no bla bla" } 只有 Lang['en'] 有效.. Lang['nl'] 无效
  • 现在我只得到 lang 值的:(nl en de)$descriptionDe = $description['lang'];我想要描述中的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多