1

私の質問は次のようなベスト フレーズです: PHP の SimpleXML で、特定の属性を持つ子を削除します。

ただし、simpleXML は使用していません。

XML for PHP は初めてなので、最善の方法を行っていない可能性があります

個々のユーザーごとに $dom->save($xml) を使用して作成された xml があります。(非公開の理由により、すべてを 1 つの xml に配置していません)

それは私にそのxml宣言を与えます<?xml version="1.0"?>(他の人にそれを作成する方法はわかりませんが、うまくいけばそれはポイントではありません)

<?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>

そして、削除ボタンを使用してアクティブ化された関数を実行するときに、php の DOM クラスで id という名前の特定の属性を持つカテゴリを削除したいと考えています。

以下は、機能しようとしている関数のデバッグです。私が間違っていることを知ることができますか?

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 );
    }

上記は、リターンをifの外側にスロットすると、常に[0]-> 0の配列を出力します。より良い方法はありますか?getElementbyId も使用してみましたが、その方法がわかりません。

属性を使用したくないのですが、それが物事をより簡単にするのであれば。

4

4 に答える 4

4

では、この完全な使用例を試してみましょう。

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>';
于 2009-01-19T16:10:51.937 に答える
1

categoryそれで、特定のノードを削除したいidですか?

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

XPath を使用してノードを取得することもできます。次に例を示します。

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

私はそれをテストしていませんが、動作するはずです。

于 2009-01-19T10:41:22.710 に答える
0

この変更されたバージョンで試すことができますか?

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

それは私のために働いています。ニーズに合わせて調整してください。そのまま使用することを意図したものではなく、概念実証にすぎません。また、文字列からxml宣言を削除する必要があります。

于 2009-01-19T15:07:30.253 に答える
0

メーリング リストからメールを削除するように変更された上記の関数

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);
于 2010-05-12T12:03:29.597 に答える