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

Posted

技术标签:

【中文标题】PHP SIMPLEXML XPATH 匹配具有相同子字符串的多个标签【英文标题】:PHP SIMPLEXML XPATH match multiple tags with same substring 【发布时间】:2015-08-03 07:21:15 【问题描述】:

我正在做一个简单的脚本,它接受一个 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,而我只想要 Title 下的所有内容。

$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】:

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

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

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

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

... 查找具有子元素 &lt;E:LocalizableTitleExt&gt; 值的元素,该值包含另一个子元素 &lt;Episode&gt; 的值。

【讨论】:

谢谢,试试看

以上是关于PHP SIMPLEXML XPATH 匹配具有相同子字符串的多个标签的主要内容,如果未能解决你的问题,请参考以下文章

PHP SimpleXML xpath:包含和定位

php SimpleXML 例子

simpleXML 在 php 5.4 中不起作用

SimpleXML:选择具有特定属性值的元素

使用 PHP 的 SimpleXML 访问元素的父级?

SimpleXML 和 php - 获取包含与另一个节点匹配的文本的节点