2015-01-04 2 views
-3

Я тестирую структуру XML:Как получить subsubchild с помощью XPath?

<Articles> 


... 


    <Article ID="333"> 

    <author>Paul</author> 

    <title>i hate xpath </title> 

     <child1>bla</child1> 

     <child2>blabla 
      <subchild> 
      <subsubchild DEEP = "Attribute"></subsubchild>  //this is my nightmare 
      </subchild> 
     </child2> 

     <child3>testing</child3> 

    </Article> 
... 

</Articles> 

Что XPath выражение закачает и обновить значение subsubchild ATTRIB? В основном я заинтересован в получении и обновлении суб значений любого узла, независимо от того, насколько глубоко или поверхностно он находится, если известен идентификатор родителя (333 в этом случае).

В настоящее время я использовал:

$query= "//*[@ID=333]//*node()[@DEEP and @DEEP = "Attribute"]"; 
$outcome = $xml->xpath($query); 
    echo isset($outcome[0][0]) ? "found" : "unavailable"; 

и еще несколько связанных выражений, они все расстраивает мои усилия с Invalid доклада выражения.

function XMLChangeAttribValue($ParentID, $attirbName, $attribValue, $NewValue){ 
 
     
 
      $xml //Never mind, i've create this sucessfully 
 

 
    
 
      $query = "//*[@ID=$ParentID]//*[@$attirbName = $attribValue]"; 
 
        
 

 
      $outcome = $xml->xpath($query); 
 
      echo isset($outcome[0][0]) ? "found" : "unavailable"; 
 
}

+2

Я понятия не имею, каков ваш вопрос. В разделе «Недопустимый отчет о выражении» вы понимаете, что механизм XPath сообщает об ошибке? Тогда, пожалуйста, покажите это. Вы используете PHP? Затем пометьте вопрос как таковой. XPath не является правильным инструментом для _update_ XML-документа, пожалуйста, покажите свой ожидаемый результат как XML. –

+3

Воздержитесь от личных замечаний - они не помогают получить хороший ответ на ваш вопрос. Однако обращение к моим комментариям поможет. –

+0

извините Матиас, если я озвучил imodest, я не хотел, я только удивился, заявив, что xpath не может быть использован (или, вернее, не является правильным инструментом) для обновления xml. что может быть лучше? цикл foreach? ну, по обновлению, я имел в виду, что хочу изменить значение DEEP (Attribute) на что-то по своему выбору. если у вас есть идея, скажите мне. еще раз, примите мою поговорку. –

ответ

2

XPath для выбора subsubchild вы ориентируетесь в этом случае:

$query = "//*[@ID=333]//*[@DEEP = 'Attribute']"; 

Чтобы выбрать атрибут себя, вы можете использовать:

$query = "//*[@ID=333]//*/@DEEP[. = 'Attribute']"; 

Обратите внимание, что я использовал одинарные кавычки внутри стринга g, потому что вы не можете использовать двойные кавычки внутри строки с двумя кавычками, если не избегаете их.

Следует также отметить, что использование выражения *node() в одном скоплении недействительно в выражении XPath.

+0

спасибо @Rishe. но в действительности, я не знаю узел «subsubchild» во время компиляции (или время тестирования, если вы не возражаете). Вот почему я использовал функцию node() xpath. как еще я могу получить имя узла во время выполнения? опять же, я действительно хочу выбрать все, как в «// * [@ ID = 333] // * (неизвестный узел) ... для получения любого avilable match. спасибо заранее. –

+0

@OsagieOdigie В случае, если имя элемента неизвестно, вы можете использовать '*'. См. мое редактирование выше. – JLRishe

+0

Мне жаль беспокоить вас. Функция выше (мое новое редактирование) показывает, что я пытаюсь имитировать. Я пробовал wat u said, но все же получение недопустимого выражения. Что вы видели в d-ошибке? thnks –

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