XML 使用 xPath 进行解析 - 包含相对路径的谓词
XML Parsing with xPath - predicate containing relative path
有以下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
有以下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