PHP + XML - 如何使用SimpleXML或DOMDocument重命名和删除XML元素?

时间:2012-09-20 02:32:49

标签: php xml simplexml domdocument

由于StackOverflow社区的帮助,修改了与jsTree一起使用的复杂XML源,我取得了一些成功。但是现在我有可用的数据,只有当我手动编辑XML才能执行以下操作时:

  1. 将所有<user>代码重命名为<item>
  2. 在第一个<user>代码
  3. 之前删除一些元素
  4. 'encoding=UTF-8'插入XML opener
  5. 最后将<response>(打开XML标记)修改为<root>
  6. XML文件示例:SampleXML

    我已阅读并阅读了这么多页面和谷歌但找不到实现上述项目的方法。

    点(2)我发现通过SimpleXML加载并使用UNSET我可以删除我不需要的部分,但我仍然有其余的麻烦。

    我想我可以用SimpleXML(我更熟悉)来修改源代码,然后通过之前提供的帮助继续修改代码。

    <?php
    $s = file_get_contents('http://www.fluffyduck.com.au/sampleXML.xml');
    $doc1 = simplexml_load_string($s);
    
    unset($doc1->row);
    unset($doc1->display);
    
    #$moo = $doc1->user;
    echo '<textarea>';
    echo $doc1->asXML();
    echo '</textarea>';
    
    $doc = new DOMDocument();
    $doc->loadXML($doc1);
    
    $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))
                    {
                            if($attr->name == "username") {
                                    $content->appendChild($doc->createElement('name', $attr->value));
                            } else {
                                $content->appendChild($doc->createElement($attr->name, $attr->value));
                            }
                        $i--;
                    }
                }
            }
        }
    }
    $doc->saveXML();
    
    header("Content-Type: text/xml");
    echo $doc->saveXML();
    
    ?>
    

1 个答案:

答案 0 :(得分:2)

使用递归,您可以根据输入创建一个全新的文档,一次解决所有问题:

<强>代码

<?php

$input = file_get_contents('http://www.fluffyduck.com.au/sampleXML.xml');
$inputDoc = new DOMDocument();
$inputDoc->loadXML($input);

$outputDoc = new DOMDocument("1.0", "utf-8");
$outputDoc->appendChild($outputDoc->createElement("root"));

function ConvertUserToItem($outputDoc, $inputNode, $outputNode)
{
    if ($inputNode->hasChildNodes())
    {
        foreach ($inputNode->childNodes as $inputChild)
        {
            if (strtolower($inputChild->nodeName) == "user")
            {
                $outputChild = $outputDoc->createElement("item");
                $outputNode->appendChild($outputChild);
                // read input attributes and convert them to nodes
                if ($inputChild->hasAttributes())
                {
                    $outputContent = $outputDoc->createElement("content");
                    foreach ($inputChild->attributes as $attribute)
                    {
                        if (strtolower($attribute->name) != "id")
                        {
                            $outputContent->appendChild($outputDoc->createElement($attribute->name, $attribute->value));
                        }
                        else
                        {
                            $outputChild->setAttribute($attribute->name, $attribute->value);
                        }
                    }               
                    $outputChild->appendChild($outputContent);
                }
                // recursive call
                ConvertUserToItem($outputDoc, $inputChild, $outputChild);
            }
        }
    }
}

ConvertUserToItem($outputDoc, $inputDoc->documentElement, $outputDoc->documentElement);

header("Content-Type: text/xml; charset=" . $outputDoc->encoding);
echo $outputDoc->saveXML();
?>

<强>输出

<?xml version="1.0" encoding="utf-8"?>
<root>
    <item id="41">
        <content>
            <username>bsmain</username>
            <firstname>Boss</firstname>
            <lastname>MyTest</lastname>
            <fullname>Test Name</fullname>
            <email>lalal@test.com</email>
            <logins>1964</logins>
            <lastseen>11/09/2012</lastseen>
        </content>
        <item 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>
        </item>
...