0

私はこことグーグルを見回しており、さまざまなコードを見つけましたが、どれも機能しません。私の正確な状況と一致するものがないためだと思います。次のようなxml構造があります。

<employees>
        <employee EmpID="">
            <first_name></first_name>
            <last_name></last_name>
            <ssnum></ssnum>
            <status></status>
            <contact_info>
                    <office_phone></office_phone>
                    <email></email>
                    <cell_phone></cell_phone>
            </contact_info>
            <access_info level="user">
                    <username></username>
                    <password></password>
            </access_info>
            <department></department>
            <date_started></date_started>
            <years></years>
            <position></position>
            <salary></salary>
            <e_increase></e_increase>
            <e_raise></e_raise>
            <photo></photo>
    </employee>
</employees>

削除したい従業員の EmpID を $ID という変数に格納しています。その従業員を完全に削除したい。私は次のようなことを試しました:

foreach ($doc->getElementsByTagName('employee') as $employee) {
    if($employee->getAttribute('EmpID') === $ID) {
        foreach ($employee as $node) {
    $node->parentNode->removeChild($node);
    }
    }
}

これらの投稿のように、同様に物事を取得しようとする他のループ: PHP XML remove element and all children by nameおよびRemove all children from a XML Node PHP DOMしかし、私はこれを正常に動作させることができませんでした.

どんな助けでも感謝します、ありがとう。

4

3 に答える 3

1

そこに行きます:

$xml = '<employees>
        <employee EmpID="1">
            <first_name></first_name>
            <last_name></last_name>
            <ssnum></ssnum>
            <status></status>
            <contact_info>
                    <office_phone></office_phone>
                    <email></email>
                    <cell_phone></cell_phone>
            </contact_info>
            <access_info level="user">
                    <username></username>
                    <password></password>
            </access_info>
            <department></department>
            <date_started></date_started>
            <years></years>
            <position></position>
            <salary></salary>
            <e_increase></e_increase>
            <e_raise></e_raise>
            <photo></photo>
    </employee>
     <employee EmpID="2">
            <first_name></first_name>
            <last_name></last_name>
            <ssnum></ssnum>
            <status></status>
            <contact_info>
                    <office_phone></office_phone>
                    <email></email>
                    <cell_phone></cell_phone>
            </contact_info>
            <access_info level="user">
                    <username></username>
                    <password></password>
            </access_info>
            <department></department>
            <date_started></date_started>
            <years></years>
            <position></position>
            <salary></salary>
            <e_increase></e_increase>
            <e_raise></e_raise>
            <photo></photo>
    </employee>
</employees>';

$doc = new DOMDocument();

$doc->loadXML($xml);

$selector = new DOMXPath($doc);
$els = $selector->query('/employees//employee');

//or
//$els = $doc->getElementsByTagName('employee');


foreach($els as $el){
    if($el->getAttribute('EmpID') == 1){
        $el->parentNode->removeChild($el);
    }
}

$xml = $doc->saveXML();

echo($xml);
于 2013-04-22T17:48:22.877 に答える
1
$ID = '';

$dom = new DOMDocument();
$dom->loadXML($xml_string);

$xpath = new DOMXpath($dom);
$nodes = $xpath->evaluate('/employees/employee[@EmpID = "' . $ID . '"]');
foreach ($nodes as $node) {
    $node->parentNode->removeChild($node);
}
于 2013-04-22T17:48:29.343 に答える
1

私のxmlを調べると、少し異なります..これを試してみてください。

foreach ($doc->getElementsByTagName('employee') as $employee) {
    if($employee->getAttribute('EmpID') === $ID) {
       $employee->parentNode->removeChild($employee);
       // $dom->save($xmlFile);
    }
}
于 2013-04-22T17:50:35.370 に答える