2013-02-15 2 views
0

Я пытаюсь прочитать файл XML структурированный, как показано нижеЧтение элементов XML

<dictionary> 
<head> 

<DNUM /> 
<DEF value="definition1" /> 
<EXAMPLE value="example of 1" /> 
<EXAMPLE value="example of 1" /> 

<DNUM /> 
<DEF value="definition2" /> 
<EXAMPLE value="example of 2" /> 
<EXAMPLE value="example of 2" /> 
<EXAMPLE value="example of 2" /> 
<EXAMPLE value="example of 2" /> 

<DNUM /> 
<DEF value="definition3" /> 
<EXAMPLE value="example of 3" /> 


</head> 
</ dictionary> 

С кодом somehing, как показано ниже, я мог читать все определения или примеры внутри тега «головы»

$result = $xml->xpath('//dictionary/head'); 
while(list(, $node) = each($result)) { 
    foreach($node->DEF as $def){ 
     echo $def["value"]."<br>\n"; 
    } 
} 

Но Я хочу получить каждое определение и примеры этого определения. Я думаю, что для этого можно использовать тег DNUM, но поскольку он не имеет открывания и закрытия отдельно, я не мог узнать, как я могу получить результат, который я хочу.

+0

вы уверены, что XML не содержит ошибок? – ajreal

+0

@ajreal: Это структура, используемая приложением словаря Windows. И это кажется правильным. – mustafa

+0

xml недействителен. Это должно быть не для закрытия – Rohit

ответ

0

Я не уверен, если я понимаю ваш вопрос, но если вам нужно найти Defs и примеры, что DEF может быть как

$result = $xml->xpath('//dictionary/head/DEF'); 
while(list(, $node) = each($result)) { 
    foreach($node->EXAMPLE as $example){ 
     echo $example["value"]."<br>\n"; 
    } 
} 
+0

Нет, это не работает. – mustafa

0

Почему бы не использовать SimpleXMLElement?

$sxe = new SimpleXMLElement($xml); 

$def = $sxe->head->dictionary->DEF->attributes(); //you can foreach this 
//or 
$def = $sxe['head']['dictionary']['DEF']->attributes(); //you can foreach this 

Вы можете получить примеры аналогичным образом. SXE могут использоваться как объекты или массивы и являются итеративными через foreach.

Лично я считаю, что SimpleXMLElement - это самый простой способ работы с XML и PHP.

Дополнительная литература: http://www.php.net/manual/en/class.simplexmlelement.php

0

Я решил проблему таким образом.

$result = $xml->xpath('//dictionary/headword/*[name()="DEF" or name()="EXAMPLE"]'); 
foreach($result as $res){ 
    echo $res["value"]."<br>"; 
} 
0

Поскольку ваша структура XML не является иерархической, вы можете рассчитывать только. Например, количество следующих элементов: DNUM

$name  = 'DNUM'; 
$elements = $xml->xpath("//$name"); 
$count = count($elements); 
foreach ($elements as $index => $element) { 
    $count--; 
    echo "Iteration $index\n"; 
    foreach ($element->xpath("following-sibling::*[count(./following-sibling::$name) = $count]") as $following) { 
     echo $following->asXML(), "\n"; 
    } 
    echo "\n"; 
} 

образцовый выход:

Iteration 0 
<DEF value="definition1"/> 
<EXAMPLE value="example of 1"/> 
<EXAMPLE value="example of 1"/> 

Iteration 1 
<DEF value="definition2"/> 
<EXAMPLE value="example of 2"/> 
<EXAMPLE value="example of 2"/> 
<EXAMPLE value="example of 2"/> 
<EXAMPLE value="example of 2"/> 

Iteration 2 
<DEF value="definition3"/> 
<EXAMPLE value="example of 3"/> 
+0

Я мало знаю об использовании следующего брата. Я только начал читать об этом. В любом случае код выводит только «Итерация 0/1/2». – mustafa

+0

@mustafa: Выход такой, как указано в anser. если вы видите только то, что вы пишете, вам кажется, что вам нужно просмотреть источник в своем браузере, используя окно браузера, естественно, вы не увидите XML. – hakre

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