如何将xml元素标签添加到正确的位置?

时间:2012-08-28 07:07:18

标签: php xml

我有代码将以下项目添加到xml文件中:

<newWord>
  <Heb>rer</Heb>
  <Eng>twew</Eng>
</newWord>
问题是,当我添加元素时,它将不在正确的位置,它是从xml标签中出来的,如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<xml>
  <newWord>
    <Heb>hebword</Heb>
    <Eng>banna</Eng>
  </newWord>
</xml>
<newWord>
  <Heb>rer</Heb>
  <Eng>twew</Eng>
</newWord>

如何将新元素添加到正确的位置? THX

我的代码:

<?php    

    $wordH=$_GET['varHeb'];
    $wordE=$_GET['varEng'];


    $domtree='';

        if(!$domtree)
        {   
            $domtree = new DOMDocument('1.0', 'UTF-8');
            $domtree->formatOutput = true;
            $domtree->load('Dictionary_user.xml');
        }

        $Dictionary_user = $domtree->documentElement;

    $currentitem = $domtree->createElement("newWord");
    $currentitem = $domtree->appendChild($currentitem);

    $currentitem->appendChild($domtree->createElement('Heb', $wordH));
    $currentitem->appendChild($domtree->createElement('Eng',$wordE));

    $Dictionary_user->childNodes->item(0)->parentNode->insertBefore($currentitem,$Dictionary_user->childNodes->item(0));
        header("Content-type: text/xml");

    $domtree->save("Dictionary_user.xml");
    /* get the xml printed */
    echo $domtree->saveXML();
?>

2 个答案:

答案 0 :(得分:2)

也许你想要这样的东西:

<?php 
if(!empty($_GET['varHeb']) && !empty($_GET['varEng'])){
    //Dont forget utf-8 if using Hebrew letters
    header('Content-type: text/xml; charset=utf-8');
    //Load It
    $xml = simplexml_load_file('./Dictionary_user.xml');

    //Add a new node & add the children
    $node = $xml->addChild('newWord');
    $node->addChild('Heb', trim($_GET['varHeb']));
    $node->addChild('Eng', trim($_GET['varEng']));


    //DOMDocument to format code output
    $dom = new DOMDocument('1.0', 'UTF-8');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->loadXML($xml->asXML());

    echo $dom->saveXML();
}else{
    //params not set for $_GET
}

/**
 * Result
<?xml version="1.0" encoding="UTF-8"?>
<xml>
  <newWord>
    <Heb>hebword</Heb>
    <Eng>banna</Eng>
  </newWord>
  <newWord>
    <Heb>אנחנו אוהבים גלישת מחסנית</Heb>
    <Eng>We Love Stack overflow</Eng>
  </newWord>
</xml>
*/

答案 1 :(得分:1)

问题是你在做什么:

$currentitem = $domtree->createElement("newWord");
$currentitem = $domtree->appendChild($currentitem);

将其更改为

$currentitem = $domtree->createElement("newWord");
$currentitem = $domtree->documentElement->appendChild($currentitem);

这将它们附加到根节点。


您的代码中还有其他一些需要改进的地方:

$wordH=$_GET['varHeb'];
$wordE=$_GET['varEng'];

确保您清理/过滤此内容。 DOM非常擅长确保不会插入恶意内容,但来自外部世界的任何内容都应该进行健全性检查。


$domtree='';

if(!$domtree)
{   

这是毫无意义的。您将$domtree设为空字符串,因此if块将始终被触发。删除该部分,只需加载XML。


    $domtree = new DOMDocument('1.0', 'UTF-8');
    $domtree->formatOutput = true;
    $domtree->load('Dictionary_user.xml');
}

当你load带有DOM的字符串或文件时,它将丢弃你放入构造函数的任何参数,并使用字符串或文件的xml prolog中的参数。所以在新建DOMDocument时你不需要提供它们。


    $Dictionary_user = $domtree->documentElement;

这是您要附加到的根节点(<xml>)。


$currentitem = $domtree->createElement("newWord");
$currentitem = $domtree->appendChild($currentitem);

这是发生错误的地方。您创建一个新元素,然后将其附加到$domtree,这是整个文档。在XPath查询中,$domtree/,而您希望附加到/xml,例如根元素。


$currentitem->appendChild($domtree->createElement('Heb', $wordH));
$currentitem->appendChild($domtree->createElement('Eng',$wordE));

这可以按预期工作。您正在添加<newWord>


$Dictionary_user
    ->childNodes
    ->item(0)
    ->parentNode
    ->insertBefore($currentitem, $Dictionary_user->childNodes->item(0));

您正在从根元素(<xml>)遍历到第一个子元素,然后再返回到父元素,这显然是根元素。所以整个遍历都没有必要。实际上,除非您想将附加的<newWord>移动到根元素的第一个子元素之上,否则根本不需要整个块。