0

こんにちは!

問題があります。1 つの Child 値に従って Element (With childs) を削除しようとしています。XML サンプルは次のとおりです。

    <?xml version="1.0" encoding="UTF-8"?>
    <Businesses>
    <Business NAME="busin1">
    <CHILD ID="30"><title>child Title</title>
    <description>Child Description</description>
    <urlToSite>http://www.MySite.co.il</urlToSite>
    <endtime>20120720103000</endtime>
    <starttime>20120710191500</starttime>
    </CHILD> 
<CHILD>...</CHILD>
<CHILD>...</CHILD>
</Business>
    </Businesses>

ここで、特定の「CHILD」要素 (子を含む) のすべてを削除する必要があります。その「endtime」値は現在よりも古いです (または単に「endtime」が特定の値に等しい)。

「endtime」は、yyyymmddHHMMSS 形式の日付です。

これが私の最初の試みです(成功せずに):

    $doc = new DOMDocument; 
    $doc->load('MyXML.xml'); //The XML Above

    $thedocument = $doc->documentElement;

    //this gives you a list of the childs
    $list = $thedocument->getElementsByTagName('CHILD');

    //figure out which ones you want -- assign it to a variable (ie: $nodeToRemove )
    $nodeToRemove = null;
$time=date("YmdHis",time ());
    foreach ($list as $domElement){
 $attrValue = $domElement->childNodes->item('endtime')->nodeValue; //not Sure about this!!
      if ($attrValue > $time) {
        $nodeToRemove = $domElement;
      }
    }

    //Now remove it.
    if ($nodeToRemove != null)
    $thedocument->removeChild($nodeToRemove);
    echo $doc->saveXML(); 

どうもありがとうございます!

4

2 に答える 2

1

XPath を使用してドキュメント ノードをクエリします。これを試して:

$maxTime = date("YmdHis", time());

$doc = new DOMDocument();
$doc->load("MyXML.xml");

$xpath = new DOMXPath($doc);
$q = "/Businesses/Bisiness/CHILD/endtime[. > {$maxTime}]";
foreach ($xpath->query($q) as $node) {
    $businessNode = $node->parentNode;
    $businessesNode = $businessNode->parentNode;
    $businessesNode->removeChild($businessNode);
}

これは、XPath の例を含むすばらしいページです

于 2012-07-27T11:00:43.067 に答える
1

また会ったね!

丸一日の研究の後..ついに私は問題を発見しました..

まず、助けてくれたマイケルに感謝します。

最終的な作業コードは次のとおりです。

<?php

$doc = new DOMDocument; 
$doc->load('MyXML.xml');

$maxTime = date("YmdHis", time());

$xpath = new DOMXPath($doc);
$q = "/Businesses/Bisiness/CHILD/endtime[. < {$maxTime}]";
foreach ($xpath->query($q) as $node) {
    $businessNode = $node->parentNode;
    $businessesNode = $businessNode->parentNode;
    $businessesNode->removeChild($businessNode);
}

// inserting to variable ONLY
$last = $doc->saveXml();
// IMPORTANT!! - we have to rewrite to XML the Results back!!
file_put_contents('MyXML.xml', $last)
?>

どこにも見つからなかったので、これがお役に立てば幸いです.. :)

于 2012-07-28T18:09:11.713 に答える