如何通过给定的父 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吗?每个<account>
节点都有一个与其属性值相同的属性名称?此外,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->xpath($query) as $item) echo $item->realm . PHP_EOL; echo $item->race . PHP_EOL;
见3v4l.org/YdEUc
太棒了。你让我头疼不已!谢谢!标记为已接受。两种解决方案都很完美。以上是关于如何通过给定的父 ID 将 XML 子节点存储在 PHP 变量中?的主要内容,如果未能解决你的问题,请参考以下文章