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

时间:2011-02-10 21:41:52

标签: php xml

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

xml文件如下所示:

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

现在有大量这些具有不同类别ID(比方说1-5)我希望能够只保存类别2的那些并删除其余的。有任何想法吗?我一直在这里看到几个不同的例子,但无法让它们起作用。

像这样:

$searchString = '1';
$doc = new DOMDocument;
$doc->formatOutput = TRUE;
$doc->preserveWhiteSpace = FALSE;
$doc->load($path.'name.xml');
$xPath = new DOMXPath($doc);
$query = sprintf('//data/row[./PCatID[text()="%s"]]', $searchString);
}
$doc->saveXML();

请帮帮我。

提前感谢。

2 个答案:

答案 0 :(得分:0)

只需使用XPath查找这些行并将其删除:

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

答案 1 :(得分:0)

虽然上面的答案看起来很可靠,但它确实对我不起作用。最后,通过执行以下操作,我得到了我需要的工作:

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

因此,在这种情况下,请参阅上面的“行”,“PCatID”

的信息