2014-11-10 4 views
2

Я борюсь с задачей. Я пытаюсь создать функцию, которая показывает только элементы журнала, где Author1/Auth1 является одним из авторов. Я получаю перечисленные три элемента журнала, но я могу только отделить каждый журнал до новой строки. Мне не удается отделить каждый журнал-ребенок в результате (и предпочтительно с текстом рядом с значением) до новых строк (<br />).PHP, XML и XPath: отображать определенные узлы

У меня есть следующий документ XML:

<Journals> 
    <Journal> 
     <Title>Title1</Title> 
     <AuthorName>Author1</AuthorName> 
     <AuthorName>Author2</AuthorName> 
     <AuthorName>Author3</AuthorName> 
     <JournalName>One</JournalName> 
    </Journal> 
    <Journal> 
     <Title>Title2</Title> 
     <AuthorName>Author2</AuthorName> 
     <AuthorName>Author1</AuthorName> 
     <JournalName>Two</JournalName> 
    </Journal> 
    <Journal> 
     <Title>Title3</Title> 
     <AuthorName>Author3</AuthorName> 
     <JournalName>Three</JournalName> 
    </Journal> 
    <Journal> 
     <Title>Title4</Title> 
     <AuthorName>Author3</AuthorName> 
     <AuthorName>Author2</AuthorName> 
     <AuthorName>Author4</AuthorName> 
     <JournalName>Four</JournalName> 
    </Journal> 
    <Journal> 
     <Title>Title5</Title> 
     <AuthorName>Author2</AuthorName> 
     <AuthorName>Auth1</AuthorName> 
     <JournalName>Five</JournalName> 
    </Journal> 
    <Journal> 
     <Title>Title6</Title> 
     <AuthorName>Author2</AuthorName> 
     <AuthorName>Author3</AuthorName> 
     <JournalName>Six</JournalName> 
    </Journal> 
</Journals> 

И следующий PHP документ:

<?php 
    header('Content-Type: text/html; charset=utf-8'); 
    error_reporting(E_ERROR | E_WARNING | E_PARSE); 


/* FUNCTION FOR ALL ARTICLES PUBLISHED BY Author1 */ 
    function taskOne()    
    { 
    $doc = new DOMDocument(); 
    $doc->load("file.xml"); 
    $xml = new DOMXPath($doc); 

    $query = $xml->evaluate("/Journals/Journal/AuthorName[contains(. , 'Author1') or contains(. , 'Auth1')]/.."); 
    foreach ($query as $temp) 
     { 
     echo $temp->nodeValue . "<br />"; 
     } 
    } 
    taskOne(); 
?> 

Теперь другой вопрос: Каким образом, используя запрос XPath: /Journals/Journal[contains(AuthorName, 'Author1') or contains(AuthorName, 'Auth1')] только перечисляет журнал где Author1 является главным автором, а не тем, где он является дочерним братом с номером два или три? Вот конечный результат с XPath запроса:/Journals/Journal/AuthorName[contains(. , 'Author1') or contains(. , 'Auth1')]/..

Title1 Author1 Author2 Author3 One 
Title2 Author2 Author1 Two 
Title5 Author2 Auth1 Five 

Вот конечный результат с XPath запроса:/Journals/Journal[contains(AuthorName, 'Author1') or contains(AuthorName, 'Auth1')]

Title1 Author1 Author2 Author3 One 

И clarfications, это хочу я пытаюсь достичь :

Title: Title1 
Journal author: Author1 
Journal author: Author2 
Journal author: Author3 
Journal name: One 

Title: Title2 
Journal author: Author2 
Journal author: Author1 
Journal name: Two 

Title: Title5 
Journal author: Author2 
Journal author: Auth1 
Journal name: Five 
+0

так, Что конечный результат будет выглядеть? – Ghost

+0

@Ghost Я добавил вывод для обоих запросов. – Thomas

+0

wait Я имею в виду в первом комментарии, что должно быть правильным окончательным результатом (желаемый результат). – Ghost

ответ

2

Вы c ould просто нацелиться на то, что <Journal>, у которого есть дети <AuthorName>, который содержит эту иглу, которую вы хотите. Вы уже близки:

$doc = new DOMDocument(); 
$doc->loadXML($xml_string); 
$xpath = new DOMXpath($doc); 

$query = "//Journal[AuthorName[contains(., 'Author1') or contains(., 'Auth1')]]"; 

$journals = $xpath->query($query); 
if($journals->length > 0) { 
    foreach($journals as $journal) { // for each of the journal found 
     foreach($journal->childNodes as $e) { // loop all its nodes/children 
      if(isset($e->tagName)) { 
       echo "$e->tagName: " . $e->nodeValue . '<br/>'; 
      } 
     } 
     echo '<br/>'; 
    } 
} 

Sample Output

+0

Я посмотрю на это завтра. Прямо сейчас мой мозг работает неправильно и ему нужен сон. Спасибо за ответ! :-) – Thomas

+0

@Thomas уверен, что человек не проблема, кстати, я настраиваю демо для выхода, чтобы поиграть. – Ghost

+0

Sweet. Также проверит это. – Thomas

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