2

我有一个函数可以将一个无值元素和一堆具有值的子元素添加到一个 xml 文件中,所以我编写它来获取两个参数 $tag(String the parent node) 和 $hash(Array $elm=>$elm_value)

function addUser($tag, $hash)
    {
        $dom = new DOMDocuemnt();
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = true;
        $dom->load('file');

        $parent = $dom->createElement($tag);
        foreach($hash as $elm => $value){
            $n = $dom->createElement($elm, $value);
            $parent->appendChild($n);
        }
        $dom->appendChild($parent);

        $dom->save('file');
        return $dom->saveXML();
    }

唯一的问题是$dom->appendChild($parent)在根元素的结束标记之后附加所有内容,从而弄乱了我的 xml 文件。所以我尝试$dom->insertBefore($parent)了相同的结果。因此,我尝试了$xpath = new DOMXPath($dom); $root = $xpath->query('/')->item(0); $root->appendChild($parent);. 结果相同。然后我尝试使用 And 选择根元素,$dom->getElementsByTagName(name of root)->item(0);当它真正起作用时我感到很惊讶!但是如果我不知道标签名称怎么办?是否有另一种选择根元素的方法,以便调用 appendChild 或 inserBefore 将在根结束标记之前而不是之后添加元素?

4

1 回答 1

3

这似乎有效:

初始 XML 文件 -

<!-- test.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <node Id="1">
        <Clicks>click1</Clicks>
    </node>
</root>

PHP -

<?php

function addUser($tag, $hash) {
    $dom = new DOMDocument('1.0');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->load('test.xml');

    $parent = $dom->createElement($tag);
    $dom->documentElement->appendChild($parent);
    foreach($hash as $elm => $value){
        $n = $dom->createElement($elm);
        $n->appendChild( $dom->createTextNode( $value ) );
        $parent->appendChild($n);
    }

    $dom->save('test.xml');
}

$arr = array( 'name' => 'pushpesh', 'age' => 30, 'profession' => 'SO bugger' );
addUser('user', $arr);

XML 文件现在是 -

<!-- test.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node Id="1">
    <Clicks>click1</Clicks>
  </node>
  <user>
    <name>pushpesh</name>
    <age>30</age>
    <profession>SO bugger</profession>
  </user>
</root>

希望这可以帮助。

于 2012-06-11T10:02:44.743 回答