2015-12-21 2 views
1

Я хотел бы проанализировать XML-файл, созданный приложением Folker. Это приложение для транскрибирования устного текста. Иногда он сохраняет строки в хорошем формате, который может обрабатываться SimpleXML, но иногда это не так.SimpleXML удаляет теги в узле

Эта линия хороша:

<contribution speaker-reference="KU" start-reference="TLI_107" end-reference="TLI_109" parse-level="1"> 
    <unparsed>ich überLEG mir das [nochma:l,]</unparsed> 
</contribution> 

Эта линия не является:

<contribution speaker-reference="VK" start-reference="TLI_108" end-reference="TLI_111" parse-level="1"> 
    <unparsed>[JA:_a; ]<time timepoint-reference="TLI_109"/>ja,<time timepoint-reference="TLI_110"/>also (.) wie [geSAGT;]</unparsed> 
</contribution> 

Во второй строке SimpleXML удаляет метки, которые находятся внутри unparsed узла.

Как я могу получить SimpleXML, чтобы не удалить эти теги, но разобрать его в более глубоких узлов или выходов в качестве объекта, например, как это (только в формате JSON для лучшего понимания):

"contribution": { 
    "speaker-reference": "VK", 
    "start-reference": "TLI_108", 
    "end-reference": "TLI_111", 
    "parse-level": "1", 
    "unparsed": { 
     "content": "[JA:_a; ]", 
     "time": { 
      [ 
       "timepoint-reference": "TLI_109", 
       "content": "ja," 
      ], 
      [ 
       "timepoint-reference": "TLI_110", 
       "content": "also (.) wie [geSAGT;]" 
      ] 
     } 
    } 
} 

ответ

0

Нет, это не удалить их. Это работает безотказно (интересное приложение кстати):

<?php 
$string = '<contribution speaker-reference="VK" start-reference="TLI_108" end-reference="TLI_111" parse-level="1"> 
    <unparsed>[JA:_a; ]<time timepoint-reference="TLI_109"/>ja,<time timepoint-reference="TLI_110"/>also (.) wie [geSAGT;]</unparsed> 
</contribution>'; 

$xml = simplexml_load_string($string); 
$t = $xml->unparsed->time[0]; 
print_r($t->attributes()); 
?> 
// output: 
SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [timepoint-reference] => TLI_109 
     ) 

) 

Вы даже можете перебирать их:

$times = $xml->unparsed->children(); 
foreach ($times as $t) { 
    $attributes = $t->attributes()); 
    // do sth. useful with them afterwards 
} 

Подсказка: Предположительно, вы пытаетесь print_r() или var_dump() на дереве XML. Это иногда дает непрозрачные результаты, так как большая часть магии происходит за кулисами. Лучше использовать echo $xml->asXML();, чтобы увидеть фактическую строку XML.

+0

Вы правы. Он не удаляет их, но он по-прежнему не работает, как я ожидал, или, скорее, хочу, чтобы он работал: D Мне нужно, чтобы три строки были разделены, но я думаю, что это проблема с XML, сгенерированным инструментом. – Heiko

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