2013-03-07 5 views
0

У меня есть много и много paragraph элементов в XML, и внутри этих абзацев часто бывают дочерние элементы, такие как name. Я хочу запустить xpath, который вернет значение дочерних элементов и xml:id родительского абзаца. Идеальным результатом будет какой-то массив, в котором ключ является paragraph элементом xml:id, а значением является текстовый узел дочернего элемента name. Любые идеи, как я мог бы выполнить это с помощью одного xpath?xpath, возвращающий пару значений (с использованием php)

В настоящее время я пытался что-то вроде этого задействовать два xpaths и попытку свести их вместе, но это становилось довольно грязным и не работало.

$result_array = array(); 
    $xmldoc = simplexml_load_file("$fullfilename"); 
    $xmldoc->registerXPathNamespace("tei", "http://www.tei-c.org/ns/1.0"); 
    $names = $xmldoc->xpath("//name"); 
foreach ($names as $name) 
{ 
    $pids = $xmldoc->xpath("//tei:p[tei:name='$name']/@xml:id") 
    $result_array[$name] = $pids[0] 
} 

У меня есть ошибка, которая гласит, что [$name] является незаконным смещением. Я также просто не думаю, что это даст то, что я хочу, потому что я считаю, что он всегда будет возвращать xml:id для первого абзаца, у которого есть дочерний элемент name, значение которого соответствует введенному. Но я хочу это абзац xml: id для абзаца, в котором был найден этот экземпляр.

Благодарим за помощь.

+0

почему бы вам не попробовать https://code.google.com/p/phpquery/ ? – deadlock

+0

Пожалуйста, добавьте свой XMl к вопросу, а также – JWiley

+0

Попробуйте изменить '' // tei: p [tei: name = '$ name']/@ xml: id "' to '" // tei: p [tei: name = "+ $ name" + "]/@ xml: id" ' – JWiley

ответ

0

SimpleXMLElement :: xpath возвращает массив объектов SimpleXMLElement или FALSE в случае ошибки.

Это означает, что вы используете объект SimpleXMLElement в качестве ключа массива, следовательно, ошибку для незаконного смещения.

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

$result_array[(string) $name] = $pids[0]; 

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

  • Нет связанных вопросов^_^