Nasıl PHP XML Dom onun nitelik değerini kullanarak belirli bir düğüm kaldırırım?

6 Cevap php

My question is best phrase as: http://stackoverflow.com/questions/262351/remove-a-child-with-a-specific-attribute-in-simplexml-for-php

Ben SimpleXML kullanarak değilim hariç.

Ben bu yüzden en iyi şekilde yapıyor olabilir PHP için XML yeniyim

Ben $ dom-> her kullanıcı için ($ xml) tasarruf kullanılarak oluşturulan bir xml var. (Nedeniyle açıklanmayan nedenlerle bir xml tüm yerleştirerek değil)

Bana bu xml bildirgeyi <?xml version="1.0"?> verir (diğerleri bunu yapmak için nasıl hiçbir fikrim, ama umarım, nokta değil)

<?xml version="1.0"?>
<details>
 <person>name</person>
 <data1>some data</data1>
 <data2>some data</data2>
 <data3>some data</data3>
 <category id="0">
  <categoryName>Cat 1</categoryName>
  <categorydata1>some data</categorydata1>
 </category>
 <category id="1">
  <categoryName>Cat 2</categoryName>
  <categorydata1>some data</categorydata1>
  <categorydata2>some data</categorydata2>
  <categorydata3>some data</categorydata3>
  <categorydata4>some data</categorydata4>
 </category>
</details>

Ve ben bir kaldır düğmesini kullanarak aktive bir işlevi çalıştırdığınızda php DOM sınıfı ile id adında özel bir niteliği olan bir kategoriyi kaldırmak istiyorum.

Aşağıdaki işe almak için çalışırken fonksiyon im hata ayıklama olduğunu. I yanlış ne yapıyorum biliyor musun?

function CatRemove($myXML){
    	$xmlDoc = new DOMDocument();
    	$xmlDoc->load( $myXML );
    	$categoryArray = array();

    	$main = $xmlDoc->getElementsByTagName( "details" )->item(0);

    	$mainElement = $xmlDoc->getElementsByTagName( "details" );
    	foreach($mainElement as $details){
    		$currentCategory = $details->getElementsByTagName( "category" );
    		foreach($currentCategory as $category){
    			$categoryID = $category->getAttribute('id');
    			array_push($categoryArray, $categoryID);
    			if($categoryID == $_POST['categorytoremoveValue']) {
    				return $categoryArray;
    			}
    		}
    	}


    	$xmlDoc->save( $myXML );
    }

Well the above prints me an array of [0]->0 all the time when i slot the return outside the if. is there a better way? I've tried using getElementbyId as well but I've no idea how to work that.

Ben bu işler daha kolay olurdu eğer rağmen bir nitelik kullanmamayı tercih ederim.

6 Cevap

Tamam, bu kullanım tam bir örnek deneyelim:

function CatRemove($myXML, $id) {
    $xmlDoc = new DOMDocument();
    $xmlDoc->load($myXML);
    $xpath = new DOMXpath($xmlDoc);
    $nodeList = $xpath->query('//category[@id="'.(int)$id.'"]');
    if ($nodeList->length) {
    	$node = $nodeList->item(0);
    	$node->parentNode->removeChild($node);
    }
    $xmlDoc->save($myXML);
}

// test data
$xml = <<<XML
<?xml version="1.0"?>
<details>
 <person>name</person>
 <data1>some data</data1>
 <data2>some data</data2>
 <data3>some data</data3>
 <category id="0">
  <categoryName>Cat 1</categoryName>
  <categorydata1>some data</categorydata1>
 </category>
 <category id="1">
  <categoryName>Cat 2</categoryName>
  <categorydata1>some data</categorydata1>
  <categorydata2>some data</categorydata2>
  <categorydata3>some data</categorydata3>
  <categorydata4>some data</categorydata4>
 </category>
</details>
XML;
// write test data into file
file_put_contents('untitled.xml', $xml);
// remove category node with the id=1
CatRemove('untitled.xml', 1);
// dump file content
echo '<pre>', htmlspecialchars(file_get_contents('untitled.xml')), '</pre>';

Yani bir spesifik ile category düğüm kaldırmak istiyorum id?

$node = $xmlDoc->getElementById("12345");
if ($node) {
    $node->parentNode->removeChild($node);
}

Ayrıca, örneğin, bir düğüm almak için XPath kullanabilirsiniz:

$xpath = new DOMXpath($xmlDoc);
$nodeList = $xpath->query('//category[@id="12345"]');
if ($nodeList->length) {
    $node = $nodeList->item(0);
    $node->parentNode->removeChild($node);
}

Ben henüz denemedim ama çalışması gerekir.

Bu değiştirilmiş bir sürümü ile deneyebilirsiniz:

function CatRemove($myXML, $id){
    $doc = new DOMDocument();
    $doc->loadXML($myXML);
    $xpath = new DOMXpath($doc);
    $nodeList = $xpath->query("//category[@id='$id']");
    foreach ($nodeList as $element) {
        $element->parentNode->removeChild($element);
    }

    echo htmlentities($doc->saveXML());
}

It's working for me. Just adapt it to your needs. It's not intended to use as-is, but just a proof of concept. You also have to remove the xml declaration from the string.

here's my modified version that's not working still. No errors but not sure what's missing...

function CatRemove($myXML){
	$xmlDoc = new DOMDocument();
	$xmlDoc->load( $myXML );
	$IDkarşıRemove = $_POST['CatID'];

	//ADD REMOVE BIT HERE		
	$xmlDoc_string = $xmlDoc->saveXML(); 
	$xmlDoc->loadXML($xmlDoc_string); 
	$xpath = new DOMXpath($xmlDoc);
	$nodeList = $xpath->query("//category[@id='$IDkarşıRemove']");
	foreach ($nodeList as $element) {
		$element->parentNode->removeChild($element);
	}

	$xmlDoc->save( $myXML );
}

i geçtiyseniz da başarısız olur

$nodeList = $xpath->query("//category[@id='$IDkarşıRemove']");

karşı

$nodeList = $xpath->query('//category[@id="'.$IDkarşıRemove.'"]');

Yukarıdaki funciton bir e-posta listesine bir e-posta kaldırmak için modifiye

function CatRemove($myXML, $id) {
    $xmlDoc = new DOMDocument();
    $xmlDoc->load($myXML);
    $xpath = new DOMXpath($xmlDoc);
    $nodeList = $xpath->query('//subscriber[@email="'.$id.'"]');
    if ($nodeList->length) {
        $node = $nodeList->item(0);
        $node->parentNode->removeChild($node);
    }
    $xmlDoc->save($myXML);
}
$xml = 'list.xml';
$to = $_POST['email'];//user already submitted they email using a form 
CatRemove($xml,$to);

Ben fikri sevdim ve başarılı giriş dan bir e-posta adresi kullanmak için kod değiştirdi

//pull session info in
session_start();
$id = $_SESSION['id'];
$email = $_SESSION['email'];
session_write_close();
//end session

//delete current user from DB
$sql="DELETE FROM users WHERE id = '$id'";
$result=mysql_query($sql, $db) or die ('Query failed: ' . mysql_error());

//delete all users entries from guestbook
$xmlDoc = new DOMDocument();
$xmlDoc->load('xml/guestbook.xml');
$xpath = new DOMXpath($xmlDoc);
$nodeList = $xpath->query('//entry[@id="' . $email . '"]');
foreach ($nodeList as $element) {
    $element->parentNode->removeChild($element);
}
$xmlDoc->save('xml/guestbook.xml');

//autologout
include('logout.php');

header("Location: http://uxd4t1.no-ip.biz/index.html");

?>

XML SAYFA

<?xml version="1.0" encoding="UTF-8"?>
<guestbook>
    <entry id="eric@me.com">
        <topic>Hello World!</topic>
        <users>Eric Fraschilla</users>
        <email>eric@me.com</email>
        <comments>Hola Como Esta</comments>
    </entry>
</guestbook>

XSL SAYFA

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>Guest Book</h2>
  <table>
    <tr>
      <th>Topic</th>
      <th>Name</th>
      <th>E-Mail</th>
      <th>Comments</th>
    </tr>
    <xsl:for-each select="guestbook/entry">
    <tr>
      <td><xsl:value-of select="topic"/></td>
      <td><xsl:value-of select="users"/></td>
      <td><xsl:value-of select="email"/></td>
      <td><xsl:value-of select="comments"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>