如何在XML文件中连接类似的标记

时间:2014-10-16 09:54:01

标签: php mysql xml

单个XML记录集中可以有一个或多个类似的XML标记。如果有很多,我需要它们在一个标签中,以逗号分隔。 这是我现在的XML。

<?xml version="1.0"?>
    <Results>
        <Recordset setCount="3">

            <Record setEntry="0">
                <AU>One</AU>
                <AU>Two</AU>
                <AU>three</AU>
            </Record>

            <Record setEntry="1">
                <AU>One</AU>
                <AU>Two</AU>
                <AU>Three</AU>
                <AU>Four</AU>
                <AU>Five</AU>
                <AU>Six</AU>
                <AU>Seven</AU>
            </Record>

            <Record setEntry="2">
                <AU>One</AU>
            </Record>

        </Recordset>
    </Results>

我需要它像这样。请帮忙查一下代码。

<?xml version="1.0"?>
<Results>
<Recordset setCount="3">

<Record setEntry="0">
<AU>One, Two, Three</AU>
</Record>

<Record setEntry="1">
<AU>One, Two, Three, Four, Five, Six, Seven</AU>
</Record>

<Record setEntry="2">
<AU>One</AU>
</Record>

</Recordset>
</Results>

1 个答案:

答案 0 :(得分:0)

这可以使用xpath完成。以下是 Simplexml 的示例:

您可以先找到所有第一片叶子:

foreach ($xml->xpath('//*[not(*) and not(preceding-sibling::*)]') as $firstLeaf) {
    ...
}

然后你将文本与以下所有叶子连在一起:

    $followingWithSameName = 'following-sibling::*[name(.) = name(preceding-sibling::*[last()])]';
    // change the text of the first leaf
    $firstLeaf[0] = implode(', ', $firstLeaf->xpath(".|$followingWithSameName"));

然后删除以下所有叶子:

    // remove all following leafs with the same name
    foreach ($firstLeaf->xpath($followingWithSameName) as $leaf) {
        unset($leaf[0]);
    }

Demo