PHP SIMPLEXML XPATH匹配具有相同子字符串的多个标记

时间:2015-05-21 14:34:44

标签: php xml xpath

我正在做一个简单的脚本,它将XML作为输入,修改一些值,并用另一个名称保存它。

XML有多个名称空间,通常是嵌套的。

我正试图找到解决以下问题的聪明方法。

我有多个标签,它们有一个共同的子串,例如Episode

<ext:EpisodeLong>Test</ext:EpisodeLong>
<ext:EpisodeBrief>Test</ext:EpisodeBrief>
<ext:EpisodeName>Test</ext:EpisodeName>

我想访问匹配&#34; Episode&#34;的每个标签。并修改该值。

相关剪辑的XML:

<Title endDateTime="2015-05-21T04:06:48Z" providerVersionNum="1" startDateTime="2015-05-02T04:06:48Z" uriId="c5.channel5.com/TITL0000000000001360">
    <core:Ext xmlns:core="http://www.cablelabs.com/namespaces/metadata/xsd/core/1">
        <ext:LocalizableTitleExt xmlns:ext="URN:NNDS:CMS:ADI3:01"    
        <xml:lang="eng">
            <ext:EpisodeLong>Test</ext:EpisodeLong>
            <ext:EpisodeBrief>Test</ext:EpisodeBrief>
            <ext:EpisodeName>Test</ext:EpisodeName>
        </ext:LocalizableTitleExt>

我试图做的所有xpath都失败了。如果我执行下面的行,我会获取99%的XML,而我只需要标题下的所有内容。

$results = $xml->xpath('//*[contains(E:LocalizableTitleExt, Episode)]');
foreach ($results as $s) 
{
    echo "DEBUG, xpath has found: ".$s."<br/>";
    $elementsToRemove[] = $s;       
}   

*假设所有名称空间已经注册,E是ext,C是Core

想法?

提前致谢

ps:不能使用DOM,只能使用SimpleXML和XPATH

1 个答案:

答案 0 :(得分:0)

您可以使用local-name()函数获取XML标记名称。另请注意,文字字符串需要使用单引号或双引号分隔:

$results = $xml->xpath('//*[contains(local-name(), "Episode")]');

要与上面的正确xpath形成对比,请尝试以下xpath:

//*[contains(E:LocalizableTitleExt, Episode)]

...查找具有子元素<E:LocalizableTitleExt>值的元素,该值包含另一个子元素<Episode>的值。