xml - 使用 xPath 进行 XML 解析 - 包含相对路径的谓词
问题描述
具有以下 XML:
<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://example.com/importer" version="1.0">
<metadata>
<provider>company</provider>
</metadata>
<assets>
<asset type="title">
<metadata>
<original_spoken_locale>es-US</original_spoken_locale>
<default_metadata_locale>en-US</default_metadata_locale>
<country_of_origin>US</country_of_origin>
<series>
<id>2845SD</id>
<locale_data lang="en-US">
<title>New Movie</title>
<synopsis_short>Short Description</synopsis_short>
<synopsis_medium>Medium Description</synopsis_medium>
<synopsis_long>Long Description</synopsis_long>
</locale_data>
</series>
<season>
<container_id>4345SD</container_id>
<season_display_number>2</season_display_number>
<locale_data lang="en-US">
<title>Season 2 Title</title>
<synopsis_short>Season 2 Short Description</synopsis_short>
<synopsis_medium>Season 2 Medium Description</synopsis_medium>
<synopsis_long>Season 2 Long Description</synopsis_long>
</locale_data>
</season>
</metadata>
</asset>
</assets>
</package>
然后我获得 xpath 对象:
$xmlDoc = new \DOMDocument();
$xmlDoc->loadXML($xml_string);
$xpath = new \DOMXpath($xmlDoc);
$xpath->registerNamespace("m", "http://example.com/importer");
工作 xpath 查询:
$xpath->query("//m:package/m:metadata/m:provider")
=> DOMNodeList {#4696
+length: 1,
}
$xpath->query("//m:package/m:assets/m:asset/m:metadata/m:season/m:locale_data[@lang='en-US']/m:title")
=> DOMNodeList {#4722
+length: 1,
}
我想要的是 locale_data 节点的 lang 值以匹配 default_metadata_locale 的值。以下不起作用:
$xpath->query("//m:package/m:assets/m:asset/m:metadata/m:season/m:locale_data[@lang='../../m:default_metadata_locale']/m:title")
=> DOMNodeList {#4720
+length: 0,
}
也试过:
$xpath->query("//m:package/m:assets/m:asset/m:metadata/m:season/m:locale_data[@lang='./../../m:default_metadata_locale']/m:title")
这是 PHP 代码,但应该无关紧要,因为 xpath 是通用查询语言。任何指导将不胜感激。
解决方案
我仍然不确定你在追求什么,但试试这个 xpath 表达式(严格基于你上面的 xml),看看它是否有效:
//package/assets/asset/metadata/season/locale_data[@lang=../../default_metadata_locale]/title
推荐阅读
- javascript - gulp4 的 watch 任务的问题
- xcode - XCode 9.3 缺少时间线滑块
- arduino - 将文本从 PROGMEM 传递到 Arduino 中的功能
- excel - 多个 IF 和 AND
- node.js - 如何使用 fetchMessages() 获取一定数量的消息,然后以某种方式发送它们?
- python-3.x - Discord.py 是否可以在没有人在服务器中的情况下向某人发送直接消息?
- r - R函数trim()的包是什么?
- java - 如何从列表的哈希集中获取项目?
- nginx - JHipster 社交登录中的重定向 URL 不正确
- linux - 将子文件夹移出到新存储库