我有一个像这样的xml文件,它有一些警报 alert.xml
<?xml version="1.0"?>
<alerts>
<alert>
<id>3</id>
<msg_type>1</msg_type>
<msg>Some Message</msg>
<url>Some Link</url>
<status>0</status>
<create_date>1388049941</create_date>
<update_date>1388052529</update_date>
</alert>
<alert>
<id>6</id>
<msg_type>1</msg_type>
<msg>Some Message</msg>
<url>Some Link</url>
<status>0</status>
<create_date>1388049941</create_date>
<update_date>1388052529</update_date>
</alert>
<alert>
<id>14</id>
<msg_type>1</msg_type>
<msg>Some Message</msg>
<url>Some Link</url>
<status>0</status>
<create_date>1388049941</create_date>
<update_date>1388052529</update_date>
</alert>
<alert>
<id>24</id>
<msg_type>1</msg_type>
<msg>Some Message</msg>
<url>Some Link</url>
<status>0</status>
<create_date>1388049941</create_date>
<update_date>1388052529</update_date>
</alert>
</alerts>
现在我正在使用这样的PHP来读取此文件以查找记录。
$alerts = new simpleXMLElement($filename, null, true);
$search_mediums1 = $alerts->xpath('alert[msg_type=1]');
$search_mediums = array_reverse($search_mediums1);
foreach ($search_mediums as $arr_alert) {
if ($arr_alert->id == $my_id) {
// i want some code here to delete that node
// and put it into some other xml with same structure file
break;
}
}
我找到了一些DOMDocument();
课程的解决方案,但我在这里使用simpleXMLElement
它正常工作以查找所需的msg_type=1
和id=$my_id
记录,现在我想从alert.xml
文件中删除该节点,如果找到并将其放入具有相同格式的other xml file
中为alert.xml
。如何从“alert.xml”中删除节点并将其放入另一个xml文件中?
答案 0 :(得分:2)
根据PHP Doc,SimpleXMLElement
没有removeChild()
方法或类似方法,因此您可能会更好地使用DOMDocument
。
将此代码更改为DOM
非常简单,虽然DOM
代码看起来有点冗长且冗长......
$dom=new DOMDocument();
$dom->loadXML(/* XML content */);
$xpath=new DOMXPath($dom);
$nodeList=$xpath->query('alert[msg_type=1]');
$myID=14; // Just to demonstrate
foreach($nodeList as $node)
{
foreach($node->childNodes as $child)
{
if($child->nodeName=="id")
{
if($child->textContent==$myID)
{
$node->parentNode->removeChild($node);
}
break;
}
}
}
echo $dom->saveXML();
输出:
<?xml version="1.0"?>
<alerts>
<alert>
<id>3</id>
<msg_type>1</msg_type>
<msg>Some Message</msg>
<url>Some Link</url>
<status>0</status>
<create_date>1388049941</create_date>
<update_date>1388052529</update_date>
</alert>
<alert>
<id>6</id>
<msg_type>1</msg_type>
<msg>Some Message</msg>
<url>Some Link</url>
<status>0</status>
<create_date>1388049941</create_date>
<update_date>1388052529</update_date>
</alert>
<alert>
<id>24</id>
<msg_type>1</msg_type>
<msg>Some Message</msg>
<url>Some Link</url>
<status>0</status>
<create_date>1388049941</create_date>
<update_date>1388052529</update_date>
</alert>
</alerts>
您可以看到<alert>
已移除<id>14</id>
。
其他:
要将已删除的节点移动到另一个文档,请执行以下操作:
$target=new DOMDocument();
$target->loadXML(/* xml */);
/* ... */
if($child->textContent==$myID)
{
$target->documentElement->appendChild($target->importNode($node,true));
$node->parentNode->removeChild($node);
}
/* ... */
答案 1 :(得分:1)
我已经解决了一个使用dom_import_simplexml
方法删除所需节点的问题,如下所示
$alerts = new simpleXMLElement($filename, null, true);
$search_mediums1 = $alerts->xpath('alert[msg_type=1]');
$search_mediums = array_reverse($search_mediums1);
foreach($search_mediums as $arr_alert)
{
if($arr_alert->id==$my_id)
{
// Deleting the Node
$domRef = dom_import_simplexml($arr_alert);
$domRef->parentNode->removeChild($domRef);
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($alerts->asXML());
$dom->save($filename);
// moving the Node into another file
$target=new DOMDocument();
$target->formatOutput = true;
$target->preserveWhiteSpace = false;
$target_content = file_get_contents($target_filename);
$target->loadXML($target_content);
$target->documentElement->appendChild($target->importNode($domRef,true));
$target->save($target_filename);
break;
}
}