我有这段PHP代码,它将一组节点添加到XML文件中。它做了它应该做的大部分事情,它找到在哪里添加,但然后它不进行更新。
我有一个这样结构的xml文件。
<COMMUNITIES>
<COMMUNITY ID="c001">
<URLS>
<URL ID="u001">
<NAME>Google.com</NAME>
<URL>http://www.google.com</URL>
</URL>
</URLS>
</COMMUNITY>
</COMMUNITIES>
正在对url节点进行更新。用户点击"添加URL"链接,我像这样将新URL添加到该节点。
<URL ID="u002">
<NAME>Yahoo.com</NAME>
<URL>http://www.yahoo.com</URL>
</URL>
如果url节点存在,则追加新的url节点。如果url节点不存在,则创建它,然后附加新的url节点。
没有错误,似乎一切正常,但url节点为空。下面是PHP脚本:
function add_url( $nodeid, $urlid, $urlname, $urllink ) {
$dom = new DOMDocument();
$dom->load('communities.xml');
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;
// get document element
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//COMMUNITY[@ID='$nodeid']");
if ($nodes->length) {
$node = $nodes->item(0);
$xurl = $dom->createElement("URL");
$xurl->setAttribute("ID", $urlid);
$xuname = $dom->createElement("NAME");
$xunameText = $dom->createTextNode(mysql_escape_mimic($urlname));
$xuname->appendChild($xunameText);
$xulink = $dom->createElement("URL");
$xulinkText = $dom->createTextNode(mysql_escape_mimic($urllink));
$xulink->appendChild($xulinkText);
$xurl->appendChild($xuname);
$xurl->appendChild($xulink);
$xurls = $xpath->query("//COMMUNITY[@ID='$nodeid']/URLS");
if ($xurls->length) {
}
else {
$xurls = $dom->createElement("URLS");
}
$xurls->appendChild($xurl);
/* $node->appendChild($xurls); */
}
$dom->save('communities.xml');
}
我认为问题是我在url节点已经存在的情况下追加了它。但是我把这行注释掉了。我相信这个问题很简单,但我是新手。我在网站上找了一下,没有找到那个具体的情况。
编辑
删除
if ($xurls->length)
前的返回语句。固定函数。
在您实际保存更改之前,您正在调用return
到函数的一半-所以我猜正在发生的事情是您正在内存中进行修改,但实际上并没有将它们写入文件…
问题是,我试图向XML文件中已经为空的节点添加节点。
而不是节点有这样的数据。
<URLS>
<URL ID="u001">
<NAME>Google.com</NAME>
</URL>
</URLS>
我有一个这样的节点。
<URLS/>
常识告诉我们这应该不成问题。如果节点为空,则appendChild应该只添加数据并将节点重写为。
<URLS>
<URL ID="u002">
<NAME>Yahoo.com</NAME>
</URL>
</URLS>
下面是工作的PHP脚本。您将注意到,我创建了一个新节点,而不是附加到<URLS/>
。我还重新排序了appendChild,从顶部节点开始,而不是先创建子节点,然后将一组节点附加到顶部节点。
function add_url( $nodeid, $urlid, $urlname, $urllink ) {
$dom = new DOMDocument();
$dom->load('communities.xml');
$dom->formatOutput = true;
$dom->preserveWhiteSpace = true;
// get document element
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//COMMUNITY[@ID='$nodeid']");
if ($nodes->length) {
$node = $nodes->item(0);
$xurls = $xpath->query("//COMMUNITY[@ID='$nodeid']/URLS");
if ($xurls->length) {
}
else {
$xurls = $dom->createElement("URLS");
$node->appendChild($xurls);
}
$xurls = $dom->createElement("URLSC");
$node->appendChild($xurls);
$xurl = $dom->createElement("URL");
$xurl->setAttribute("ID", $urlid);
$xurls->appendChild($xurl);
$xuname = $dom->createElement("NAME");
$xunameText = $dom->createTextNode(mysql_escape_mimic($urlname));
$xuname->appendChild($xunameText);
$xurl->appendChild($xuname);
$xulink = $dom->createElement("URLC");
$xulinkText = $dom->createTextNode(mysql_escape_mimic($urllink));
$xulink->appendChild($xulinkText);
$xurl->appendChild($xulink);
}
$dom->save('communities.xml');
}
所以我必须修改创建空节点<URLS/>
的函数。我不应该在那个函数中创建节点而应该在add_url函数中创建它只有当它不存在的时候。