我有代码将以下项目添加到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();
?>
答案 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>
移动到根元素的第一个子元素之上,否则根本不需要整个块。