2011-02-10 76 views
0

我知道標題似乎有點怪,我提前道歉,但我希望能夠做到這一點:刪除元素時,我只需要某一些

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

請幫助我。

在此先感謝。

回答

0

只要看看使用XPath這些行並刪除它們:

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

但會刪除整個「行」不僅僅是PCatID節點吧? – rchiriboga 2011-02-11 02:44:34

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」