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ファイルを「1行ずつ」解析し、データの行を読み取って爆発させ、変更された内容でそれを格納する新しい変数を作成する方が簡単かもしれないと考えています。なので :

<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 に答える