2012-04-30 16 views
4

でXML値を変更することはできません:は、これは私のXMLファイルでPHP

<todos> 
    <todo> 
    <titel>sasd</titel> 
    <erstellt>2012-04-30 17:19:21</erstellt> 
    <erledigen_bis>2012-05-03</erledigen_bis> 
    <erledigt>Nein</erledigt> 
    <thingstodo>sffsdfdf</thingstodo> 
    </todo> 
</todos> 

今、私は「ジャ」に<erledigt>タグの内部で値を変更したいです。

私は次のコードでこれを試してみました:私を助けてください

<?php 
$filename = 'xml/todos.xml'; 

$xmlDoc = new DOMDocument(); 
$xmlDoc->load('xml/todos.xml'); 

$todos = $xmlDoc->getElementsByTagName('todo');   

foreach ($todos as $todo) { 

    $titel = $todo->getElementsByTagName('titel'); 
    $actualTitel = $titel->item(0)->nodeValue; 
    $paramTitel = $_GET["titel"]; 

    $erstellt = $todo->getElementsByTagName('erstellt');  
    $actualTimestamp = $erstellt->item(0)->nodeValue; 
    $paramTimestamp = $_GET["timestamp"]; 

    if ($paramTitel == $actualTitel && $paramTimestamp == $actualTimestamp) { 

     $todo->erledigt= 'Ja'; 

    } 
} 

$xmlDoc->save($filename); 

header('Location: todo.php'); 
?> 

、私はウェブ上で約5時間で検索し、私の問題のいずれかの解決策を見つけることができませんでした。

答えて

3

$todo->erledigtはDOMDocumentでは機能しませんが、SimpleXMLでしかできません。もう一度getElementsByTagNameを使用する必要があります。

また、要素の値を取得/設定するにはnodeValueを使用する必要があります。

if ($paramTitel == $actualTitel && $paramTimestamp == $actualTimestamp) { 
    $todo->getElementsByTagName('erledigt')->item(0)->nodeValue = 'Ja'; 
} 

DEMO:http://codepad.org/xJbQmO2u

+0

あなたは眠れぬ夜から私を救った、どうもありがとうございます! – alderos

+0

歓迎します:-) –

3

は、あなたがそれにアクセスするためのDOMメソッドとプロパティを使用して<erledigt>要素を編集する必要があります。あなたがSimpleXMLと混同しているように見えます。

$todo->getElementsByTagName('erledigt')->item(0)->nodeValue = 'Ja'; 

あなたはSimpleXMLをを使用して見てみましょうしたいならば、その後、あなたの全体のコードのようなものを見ることができます。

<?php 

$paramTitel = $_GET["titel"]; 
$paramTimestamp = $_GET["timestamp"]; 

$todos = simplexml_load_file('xml/todos.xml'); 
foreach ($todos->todo as $todo) { 
    if ($paramTitel == (string) $todo->titel 
    && $paramTimestamp == (string) $todo->erstellt 
    ) { 
     $todo->erledigt = 'Ja'; 
    } 
} 

$todos->asXML($filename); // Where does $filename come from? 

header('Location: todo.php'); 

?> 

読み出し:

+1

SimpleXMLの例も表示します:-) –

+0

コピー&ペーストの前に$ filenameの代わりに値を右にしたいのですが、私はそれを削除して編集しませんでした後で、もし私があなたを混乱させるなら、ごめんなさい。 SimpleXMLソリューションは本当に素晴らしく、うまくいきました。ありがとうございました。 – alderos

3

ドキュメント内の特定の要素を探しているように、私はあなたがXPathを使用してそれらを見つける非常にお勧め:

$xp = new DOMXPath($doc); 
$expression = sprintf('//todo[titel = "%s" and erstellt = "%s"]/erledigt', $_GET["titel"], $_GET["timestamp"]); 
$result = $xp->query($expression); 
foreach ($result as $node) { 
    $node->nodeValue = 'Ja'; 
} 

これは、次の(典型的な)XPath式に結果:意志

//todo[titel = "sasd" and erstellt = "2012-04-30 17:19:21"]/erledigt 

およびerstelltノード値が指定されているtodoノードの一部であるすべてのerledigtノードを選択します。

これで簡単に変更できます。さらに、まだ "erledigt"ではないノードerledigtを探していますが、現在の亜種は既に傷ついていません。

Demo/Full Code Example

<?php 
/** 
* @link http://stackoverflow.com/q/10388661/367456 
*/ 

$_GET["titel"] = 'sasd'; 
$_GET["timestamp"] = '2012-04-30 17:19:21'; 

$xml = '<todos> 
    <todo> 
    <titel>sasd</titel> 
    <erstellt>2012-04-30 17:19:21</erstellt> 
    <erledigen_bis>2012-05-03</erledigen_bis> 
    <erledigt>Nein</erledigt> 
    <thingstodo>sffsdfdf</thingstodo> 
    </todo> 
</todos>'; 

$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$xp = new DOMXPath($doc); 
$expression = sprintf('//todo[titel = "%s" and erstellt = "%s"]/erledigt', $_GET["titel"], $_GET["timestamp"]); 
$result = $xp->query($expression); 
foreach ($result as $node) { 
    $node->nodeValue = 'Ja'; 
} 

echo $doc->saveXML(); 
+0

私は、XPathを使ってどのXML拡張を使うのか分からない人に検索を導入することをお勧めします。 – salathe

+0

TSはDOMDocumentを使用していますので、「その」xpathを選択しました。これはxpathを持つsimple-xmlでも同じように簡単です(同じ式でもsimplexmlコードも簡素化されます)。 – hakre

+0

午後は私の研究でXPathについて読んだことがありますが、それはXML、PHP、JSの私の最初のプロジェクトであるため、私にとっては複雑でした。しかし、XPathで解決策を見てうれしく思いましたが、面白いが複雑なものにも感謝します;) – alderos

関連する問題