2015-12-21 77 views
1

标签我想解析其由称为Folker的应用产生一个XML文件。这是抄写口语文本的应用程序。有时,它节省了,可以用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

不,它不删除它们。这完美的作品(有趣的应用BTW):

<?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 
} 

提示: Assumingly,你是在XML树试图print_r()var_dump()。这有时还给不透明的结果,因为大多数的奇迹发生在幕后。更好地利用echo $xml->asXML();看到实际的XML字符串。

+0

你说得对。它不会删除它们,但它仍然不能像我预期的那样工作,或者想让它工作:D 我需要三个字符串分离,但我认为这是由该工具生成的XML的问题。 – Heiko