2015-05-21 3 views
4

Я делаю простой скрипт, который принимает XML как входной сигнал, изменяет некоторые значения и сохраняет его с другим именем.PHP SIMPLEXML XPATH соответствует нескольким тегам с одинаковой подстрокой

XML имеет несколько пространств имен, часто вложенных.

Я пытаюсь найти умное решение следующей проблемы.

У меня есть несколько тегов, которые имеют общую подстроку, например, эпизод

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

Я хочу, чтобы получить доступ к каждому и каждый тег, который соответствует «Эпизод» и изменить значение.

Соответствующие пропущено из 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> 

Все XPaths Я пытаюсь сделать не в состоянии. Если я сделаю строку ниже, я получаю 99% XML, а я хочу все только в разделе Title.

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

* принимает на себя все пространства имен уже зарегистрированы, Е вн, С Основные

Идеи?

Заранее спасибо

пс: не может использовать DOM, только SimpleXML и XPATH

ответ

0

Вы можете использовать local-name() функцию, чтобы получить имя тега XML. Также обратите внимание, что символьная строка должна быть разграничено с помощью одинарных или двойных кавычек:

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

контрасту с правильным XPath выше, следующим XPath вы пытались ...:

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

... выглядит для элемента, имеющего дочерний элемент <E:LocalizableTitleExt> значение, содержащее значение другого дочернего элемента <Episode>.

+0

Спасибо, попробует – user3375601

Смежные вопросы