php - 如何在 PHP 中使用 DOM 或 XPATH 获取最近的子节点而不是嵌套的子节点
问题描述
有一些这样的 XML 产品提要:
<SHOP>
<SHOPITEM id="2927" import-code="PREMIER">
<NAME>productname</NAME>
<DESCRIPTION>Blah, blah, blah ...</DESCRIPTION>
<RELATED_PRODUCTS>
<CODE>PXP-01-01</CODE>
<CODE>PXP-01-02</CODE>
<CODE>PXP-01-03</CODE>
</RELATED_PRODUCTS>
<FLAGS>
<FLAG>
<CODE>news</CODE>
<ACTIVE>1</ACTIVE>
</FLAG>
<FLAG>
<CODE>action</CODE>
<ACTIVE>0</ACTIVE>
</FLAG>
</FLAGS>
<CODE>PXS-01-MNCRFT</CODE>
<EAN>0702811692053</EAN>
<WEIGHT>0.5</WEIGHT>
<PRICE>123</PRICE>
<VAT>21</VAT>
</SHOPITEM>
</SHOP>
并且需要在 PHP 循环中获取产品代码。看起来很容易,但使用$item->getElementsByTagName("CODE")
是不可能的,因为我不知道正确的一个 CODE 节点的订单 ID。我尝试过使用 XPATH,但我完全迷失了,不知道如何构造查询以仅获取 SHOP > SHOPITEM > CODE 中的 CODE 值以及所有其他 inSHOP > SHOPITEM > RELATED_PRODUCTS > CODE
或 inFLAG > CODE
或 in ALTERNATIVE_PRODUCTS > CODE
... 如何排除这些或最好确切地问正确的?
解决方案
使用xpath,这样试试
$dom = new DOMDocument();
$dom->loadXML($xml_string);
$xpath = new DOMXPath($dom);
$flags = $xpath->query('//SHOPITEM//FLAGS');
foreach ($flags as $flag)
{
foreach ($xpath->query('.//FLAG/CODE',$flag) as $target) {
echo $target->nodeValue ."\n";}
};
输出:
news
action
下一个:
$codes = $xpath->query('//SHOPITEM/CODE');
foreach ($codes as $code)
{
foreach ($codes as $code) {
echo $code->nodeValue ."\n";}
};
输出:
PXS-01-MNCRFT
最后:
$rps = $xpath->query('//SHOPITEM/RELATED_PRODUCTS');
foreach ($rps as $rp)
{
foreach ($xpath->query('.//CODE',$rp) as $target) {
echo $target->nodeValue ."\n";}
};
输出:
PXP-01-01
PXP-01-02
PXP-01-03
推荐阅读
- android - 尝试在垂直 ListView Flutter 中嵌套水平 ListView
- angular - 如何配置我的服务器以从 Angular 项目开始?
- javascript - 如何实现粘性页脚?
- c - 在 C 中解析类似 shell 的应用程序的命令
- reactjs - 覆盖自定义组件属性
- javascript - 为什么我的 CSS 在 Web 服务器上的显示方式与在 localhost 上的显示方式不同?
- python - 如何在python中将应用程序窗口编程到网络摄像头
- list - 这个 Common Lisp 代码是否与 Winston / Horn 在 LISP 3rd Edition 中所教的内容相似/相等?
- python - 显示包含字符和空格以外的其他内容的文本数据框行(Python)
- node.js - 如果用户有 cookie,则对用户进行身份验证