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

标签 php xml xpath

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

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

我正在尝试为以下问题找到一个聪明的解决方案。

我有多个具有共同子字符串的标签,例如 Episode

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

我想访问每个匹配“Episode”的标签并修改值。

相关的 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

最佳答案

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

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

为了与上面正确的 xpath 对比,您尝试了以下 xpath...:

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

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

关于PHP SIMPLEXML XPATH 匹配具有相同子字符串的多个标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30376876/

相关文章:

php - SimpleXML->xpath 问题

javascript - IE 没有在 onblur 事件中调用函数

PHP/MySQL - 同时进行多个查询

php - php中ftp文件上传问题

xml - XSLT:使子节点成为上下文节点的兄弟节点

xml - XSLT 在同一级别的其他标签内移动项目

php - 如何在 Windows 上安装 Laravel 4 软件包

java - ActionBar 文本的背景颜色没有改变

java - 如何在序列化之前从 DOM 中剥离纯空白文本节点?

xml - xPath 帮助 - 选择字符串中的特定单词