使用xPath进行XML解析-包含相对路径的谓词

meta467

具有以下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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章