1

我有将如下项目添加到 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>

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

我的代码:

<?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();
?>
4

2 回答 2

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>
*/
于 2012-08-28T07:26:53.043 回答
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>) 遍历到第一个子元素,然后返回到父元素,这显然又是根元素。所以整个遍历是没有必要的。事实上,除非你想将 appended 移到<newWord>根元素的第一个子元素之上,否则根本不需要整个块。

于 2012-08-28T07:33:03.927 回答