2014-01-28 54 views
3

我收到了一個非常奇怪的XML文件來處理。使用PHP SimpleXML獲取下一個元素

相反分組與組標籤名稱,象這樣的:

<data> 
    <group> 
     <name>John</name> 
     <name>Mary</name> 
     <name>Susan</name> 
    </group> 
    <group> 
     <name>Cesar</name> 
     <name>Joseph</name> 
     <name>Sylvia</name> 
     <name>Steve</name> 
    </group> 
</data> 

它插入隔板標籤中的每個元素之後,這樣的:

<data> 
    <name>John</name> 
    <separator>,</separator> 
    <name>Mary</name> 
    <separator>,</separator> 
    <name>Susan</name> 
    <separator>;</separator> 
    <name>Cesar</name> 
    <separator>,</separator> 
    <name>Joseph</name> 
    <separator>,</separator> 
    <name>Sylvia</name> 
    <separator>,</separator> 
    <name>Steve</name> 
    <separator>.</separator> 
</data> 

「;」和「。」是小組分隔符。 (我知道,這是不可思議的,但我不能改變的,我必須處理大量的這些文件)

要獲得所有的名字和所有的分隔符,我可以使用下面的代碼:

$data = <<<XML 
    <data> 
     <name>John</name> 
     <separator>,</separator> 
     <name>Mary</name> 
     <separator>,</separator> 
     <name>Susan</name> 
     <separator>;</separator> 
     <name>Cesar</name> 
     <separator>,</separator> 
     <name>Joseph</name> 
     <separator>,</separator> 
     <name>Sylvia</name> 
     <separator>,</separator> 
     <name>Steve</name> 
     <separator>.</separator> 
    </data> 
XML; 

$xml = simplexml_load_string($data); 

foreach ($xml->name as $name){ 
    echo "$name\n"; 
} 

foreach ($xml->separator as $sep){ 
    echo "$sep\n"; 
} 

但這樣,我無法在單個循環中獲得名稱和相應的分隔符。

有沒有什麼辦法在第一個循環中知道每個名字的下一個元素?

+2

這是一個好問的問題 – hek2mgl

回答

2

解析這樣的XML和構建array

$xml = simplexml_load_string($x); 

foreach ($xml->children() as $name => $value) { 

    if ($name == 'name') $names[$i][] = (string)$value; 
    elseif ($name == 'separator' && $value == ';') $i++; 

} 

輸出$names

array(2) { 
    [0]=>array(3) { 
    [0]=>string(4) "John" 
    [1]=>string(4) "Mary" 
    [2]=>string(5) "Susan" 
    } 
    [1]=>array(4) { 
    [0]=>string(5) "Cesar" 
    [1]=>string(6) "Joseph" 
    [2]=>string(6) "Sylvia" 
    [3]=>string(5) "Steve" 
    } 
} 

然後,您可以僅從陣列挑名字。

看到它的工作:https://eval.in/95853

+1

完美!謝謝。 – javsmo

3

我希望我能理解你的問題。

$xml = simplexml_load_string($data); 
$i = 0; 
$res = ''; 
foreach ($xml->name as $name){ 
    $res .= "$name ".$xml->separator[$i]; 
    $i++; 
} 
$groups = explode(';',$res); 
+0

我認爲你必須把另一爆炸,以逗號爲每個組單獨的一個很好的例子。 '$ g = array(); foreach($ groups as $ group){$ g [] = explode(',',$ group); }'。此外,該名稱不能有「;」或裏面的「,」。但這是解決問題的一種方法。謝謝。 – javsmo