如何通过给定的父 ID 将 XML 子节点存储在 PHP 变量中?

Posted

技术标签:

【中文标题】如何通过给定的父 ID 将 XML 子节点存储在 PHP 变量中?【英文标题】:How to store XML child nodes in PHP variables through a given parent ID? 【发布时间】:2020-11-05 13:16:39 【问题描述】:
<account VGS0035="VGS0035">
        <realm>Smolderweb</realm>
        <realmint>smolderweb-us</realmint>
        <type>PvP</type>
        <race>Undead</race>
        <gender>Male</gender>
        <class>Mage</class>
        <faction>Horde</faction>
        <level>60</level>
        <description>(60% mount, green/blue gear)</description>
        <price>210</price>
        <stock>1</stock>
        <id>VGS0035</id>
        <screenshot>https://vanilla.games/wp-content/uploads/2019/08/wow-classic-mage.jpg</screenshot>
    </account>

    <account VGS0036="VGS0036">
        <realm>Faerlina</realm>
        <realmint>faerlina-us</realmint>
        <type>PvP</type>
        <race>Undead</race>
        <gender>Male</gender>
        <class>Mage</class>
        <faction>Horde</faction>
        <level>60</level>
        <description>(100% mount, epic/blue gear, Tailoring 300, First Aid 225, MC+ONY+BWL attuned, 150 gold)</description>
        <price>400</price>
        <stock>1</stock>
        <id>VGS0036</id>
        <screenshot>https://i.imgur.com/cdeAdwe.jpg</screenshot>
    </account>

    <account VGS0037="VGS0037">
        <realm>Faerlina</realm>
        <realmint>faerlina-us</realmint>
        <type>PvP</type>
        <race>Undead</race>
        <gender>Male</gender>
        <class>Mage</class>
        <faction>Horde</faction>
        <level>60</level>
        <description>(60% mount, green/blue/epic gear, 100 gold)</description>
        <price>250</price>
        <stock>1</stock>
        <id>VGS0037</id>
        <screenshot>https://vanilla.games/wp-content/uploads/2019/08/wow-classic-mage.jpg</screenshot>
    </account>

我将以下内容包装在 XML 标记中。我有一个 php 页面,我在其中传递了一个变量 page?id=VGS0003 - 我想在 PHP 变量中提取该节点的所有子元素以供使用。

Example: 

$realm = $account->realm;
$region = $account-region;
$race = $account->race;

我几乎尝试了所有方法,但似乎没有任何效果。无论我是否在循环中放置 if 语句,Foreach 都只返回最后一个节点。

                $accountID = $_GET['id'];
                

                $xmlurl = "../config/classic/accounts.php";
                include($xmlurl);
                $packages = new SimpleXMLElement($xmlstr);

                foreach($packages->accounts->account as $account)

                    if($accountID == $account->id)

                    $accountRace = $account->race;
                    $accountRaceLowerU = strtolower($accountRace);
                    $accountRaceLowerU = str_replace(' ', '_', $accountRaceLowerU);
                    $accountGender = $account->gender;
                    $accountGenderLower = strtolower($accountGender);
                    $accountClass = $account->class;
                    $accountClassLower = strtolower($accountClass);
                    $accountFaction = $account->faction;
                    $accountScreenshotThumb = $account->images->image[0];
                    $accountScreenshot = $account->screenshot;
                    $accountSKU = $account->id;
                    $accountLevel = $account->level;
                    $accountRealm = $account->realm;
                    $accountType = $account->type;

                    

                ;

如何做到这一点?我想做的很简单,但似乎我已经尝试了一切。通过ID找到account节点,将子元素值保存为php变量,在页面其他地方使用。

【问题讨论】:

你确定你的xml吗?每个&lt;account&gt; 节点都有一个与其属性值相同的属性名称?此外,xml 中没有 VGS0003 【参考方案1】:

一种选择是使用 xpath "//account[id='$id']" 和您要查找的 id。

$elements = simplexml_load_string($xmlstr);
$id = "VGS0037";
$query = "//account[id='$id']";
$account = $elements->xpath($query);
$accountRace = $account[0]->race;
echo $accountRace;

输出

Undead

Php demo

【讨论】:

谢谢你,太棒了。它确实有效。太感谢了!如果您正在观看此评论,还有一个问题 - 我如何列出所有节点为 REALM=FAERLINA?我猜 $realm = "Faerlina"; $query = "//account[realm='$realm']";这将只输出一个。我如何添加它们,将它们列为“foreach”示例?所有只有Faerlina领域的节点? @Voya7 你可以这样做$query = "//account[./realm[normalize-space() = 'Faerlina']]"; foreach ($elements-&gt;xpath($query) as $item) echo $item-&gt;realm . PHP_EOL; echo $item-&gt;race . PHP_EOL; 见3v4l.org/YdEUc 太棒了。你让我头疼不已!谢谢!标记为已接受。两种解决方案都很完美。

以上是关于如何通过给定的父 ID 将 XML 子节点存储在 PHP 变量中?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linq 删除 XML 中的子节点

Castor XML Mapping 与子节点同名

SQL通过父节点获取所有子节点

如何将XML子节点添加到父节点c#

如何从可能是与给定 id 匹配的父级或子级之一的列表中获取对象

删除没有子节点的父节点