Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我只需要某些元素时,使用php从XML文件中删除元素_Php_Xml - Fatal编程技术网

当我只需要某些元素时,使用php从XML文件中删除元素

当我只需要某些元素时,使用php从XML文件中删除元素,php,xml,Php,Xml,我知道标题可能有点奇怪,我提前道歉,但我希望能够做到这一点: xml文件如下所示: <data> <row> <EventID>12345</EventID> <Event>Name of Event</Event> <EventCat>2</PCatID> <City>Tacoma</City> <State>Washing

我知道标题可能有点奇怪,我提前道歉,但我希望能够做到这一点:

xml文件如下所示:

<data>
<row>
    <EventID>12345</EventID>
    <Event>Name of Event</Event>
    <EventCat>2</PCatID>
    <City>Tacoma</City>
    <State>Washington</State>
    <Zip>98421</Zip>
</row>
请帮帮我


提前感谢。

只需使用XPath查找这些行并删除它们:

$d = new DOMDocument();
$d->loadXml($f);
$xp = new DOMXpath($d);
foreach ($xp->query("//row[./PCatID != 2]") as $ev) {
    $ev->parentNode->removeChild($ev);
}

虽然上面的答案看起来很可靠,但对我来说确实不起作用。最后,我通过以下步骤获得了我需要的工作:

<?php
$path = 'absolute/server/path';
$file_xml = $path."/your/xml/file.xml";
$data = simplexml_load_file($file_xml);
$data_count = count($data->row);
for($i = 0; $i < $data_count; $i++)
{
//basically what you want to remove
if( ($data->row[$i]->PCatID == "1") || ($data->row[$i]->PCatID == "3") || ($data->row[$i]->PCatID == "4") )
{
    unset($data->row[$i]);
}
}
file_put_contents($file_xml, $data->saveXML());
?>


因此,在这种情况下,请参见上文中关于“row”、“PCatID”的信息,但这将删除整个“row”,而不仅仅是PCatID节点,对吗?$file\u xml=$path。“name.xml”$d=新文档()$d->load($file\u xml)$xp=新的DOMXpath($d);foreach($xp->query(//row[./PCatID!=2]”)为$ev){$ev->parentNode->removeChild($ev);}$d->save($file_-xml)@用户确定。那不是你想要的吗?在任何情况下,如果您只想删除
PCatID
元素,那么只需对xpath表达式做一点小小的更改。只是当我把这段代码放在php文件上时,没有看到任何变化。另外,$f是XML文件的绝对路径,对吗?$d->saveXml()呢;这真的需要吗?我想是这样吧?对于新手的问题,我很抱歉。我以前从未做过这种xml类型的事情。
<?php
$path = 'absolute/server/path';
$file_xml = $path."/your/xml/file.xml";
$data = simplexml_load_file($file_xml);
$data_count = count($data->row);
for($i = 0; $i < $data_count; $i++)
{
//basically what you want to remove
if( ($data->row[$i]->PCatID == "1") || ($data->row[$i]->PCatID == "3") || ($data->row[$i]->PCatID == "4") )
{
    unset($data->row[$i]);
}
}
file_put_contents($file_xml, $data->saveXML());
?>