使用PHP SimpleXML获取下一个元素

时间:2014-01-28 20:38:12

标签: php xml simplexml

我收到了一个非常奇怪的XML文件要处理。

而不是使用组标记对名称进行分组,如下所示:

<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 个答案:

答案 0 :(得分:3)

我希望我理解你的问题。

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

答案 1 :(得分: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