0

我需要重组一个非常大的 xml 源,例如在

http://www.fluffyduck.com.au/sampleXML.xml

我需要为 jstree 修改它,但是我不确定如何递归地操作数据,因为使用 simpleXml 将其加载为 xml 只会看到前 1 个用户记录。

<user id="41" username="bsmain" firstname="Boss" lastname="MyTest" fullname="Test Name" email="lalal@test.com" logins="1964" lastseen="11/09/2012">

</user>

to

<user id="41">
    <content><name>bsmain</name></content>
</user>

问题是一些 xml 行没有结束标记,例如,而是看起来像这样:

<user id="61" username="underling" firstname="Under" lastname="MyTest" fullname="Test Name" email="lalal@test.com" logins="4" lastseen="08/09/2009"/>

如果我修改此记录并添加下层 jstree 无法识别它,我假设末尾的 /> 与?

我确实想在 XML 中执行此操作,但我认为它可能更容易,以某种方式简单地“逐行”解析 xml 文件,读取数据行可能会对其进行分解,然后创建一个新变量来存储它,其中包含修改后的内容,例如作为 :

<user id="61">
    <content><name>bsmain</name>
</user>

并在末尾存在 /> 的行上,手动插入标签。

必须有一种更智能/更快的方法来实现这一目标。

4

1 回答 1

1

您最好的选择是DOMDocument用于 XML 解析。我编写了一个将属性(不包括id属性)转换为内容元素的示例:

代码

<?php
$s =
'<users>' .
    '<user id="61" username="underling" firstname="Under" lastname="MyTest" fullname="Test Name" email="lalal@test.com" logins="4" lastseen="08/09/2009"/>' .
    '<user id="61" username="underling" firstname="Under" lastname="MyTest" fullname="Test Name" email="lalal@test.com" logins="4" lastseen="08/09/2009"/>' .
    '<user id="8" test="testvalue"></user>' .
'</users>';

$doc = new DOMDocument();
$doc->loadXML($s);

$users = $doc->getElementsByTagName("user");
foreach ($users as $user)
{
    if ($user->hasAttributes())
    {
        // create content node
        $content = $user->appendChild($doc->createElement("content"));
        // transform attributes into content elements
        for ($i = 0; $i < $user->attributes->length; $i++)
        {
            $attr = $user->attributes->item($i);
            if (strtolower($attr->name) != "id")
            {
                if ($user->removeAttribute($attr->name))
                {
                    $content->appendChild($doc->createElement($attr->name, $attr->value));
                    $i--;
                }
            }
        }
    }
}

header("Content-Type: text/xml");
echo $doc->saveXML();

?>

输出

<users>
    <user id="61">
        <content>
            <username>underling</username>
            <firstname>Under</firstname>
            <lastname>MyTest</lastname>
            <fullname>Test Name</fullname>
            <email>lalal@test.com</email>
            <logins>4</logins>
            <lastseen>08/09/2009</lastseen>
        </content>
    </user>
    <user id="61">
        <content>
            <username>underling</username>
            <firstname>Under</firstname>
            <lastname>MyTest</lastname>
            <fullname>Test Name</fullname>
            <email>lalal@test.com</email>
            <logins>4</logins>
            <lastseen>08/09/2009</lastseen>
        </content>
    </user>
    <user id="8">
        <content>
            <test>testvalue</test>
        </content>
    </user>
</users>
于 2012-09-19T12:04:07.393 回答