1

以下のような項目をxmlファイルに追加するコードがあります:

<newWord>
  <Heb>rer</Heb>
  <Eng>twew</Eng>
</newWord>

問題は、要素を追加すると、適切な場所に配置されず、以下のようにxmlタグから外れることです。

<?xml version="1.0" encoding="UTF-8"?>
<xml>
  <newWord>
    <Heb>hebword</Heb>
    <Eng>banna</Eng>
  </newWord>
</xml>
<newWord>
  <Heb>rer</Heb>
  <Eng>twew</Eng>
</newWord>

新しい要素を正しい場所に追加するにはどうすればよいですか?どうも

私のコード:

<?php    

    $wordH=$_GET['varHeb'];
    $wordE=$_GET['varEng'];


    $domtree='';

        if(!$domtree)
        {   
            $domtree = new DOMDocument('1.0', 'UTF-8');
            $domtree->formatOutput = true;
            $domtree->load('Dictionary_user.xml');
        }

        $Dictionary_user = $domtree->documentElement;

    $currentitem = $domtree->createElement("newWord");
    $currentitem = $domtree->appendChild($currentitem);

    $currentitem->appendChild($domtree->createElement('Heb', $wordH));
    $currentitem->appendChild($domtree->createElement('Eng',$wordE));

    $Dictionary_user->childNodes->item(0)->parentNode->insertBefore($currentitem,$Dictionary_user->childNodes->item(0));
        header("Content-type: text/xml");

    $domtree->save("Dictionary_user.xml");
    /* get the xml printed */
    echo $domtree->saveXML();
?>
4

2 に答える 2

2

おそらく、次のようなものが必要です。

<?php 
if(!empty($_GET['varHeb']) && !empty($_GET['varEng'])){
    //Dont forget utf-8 if using Hebrew letters
    header('Content-type: text/xml; charset=utf-8');
    //Load It
    $xml = simplexml_load_file('./Dictionary_user.xml');

    //Add a new node & add the children
    $node = $xml->addChild('newWord');
    $node->addChild('Heb', trim($_GET['varHeb']));
    $node->addChild('Eng', trim($_GET['varEng']));


    //DOMDocument to format code output
    $dom = new DOMDocument('1.0', 'UTF-8');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->loadXML($xml->asXML());

    echo $dom->saveXML();
}else{
    //params not set for $_GET
}

/**
 * Result
<?xml version="1.0" encoding="UTF-8"?>
<xml>
  <newWord>
    <Heb>hebword</Heb>
    <Eng>banna</Eng>
  </newWord>
  <newWord>
    <Heb>אנחנו אוהבים גלישת מחסנית</Heb>
    <Eng>We Love Stack overflow</Eng>
  </newWord>
</xml>
*/
于 2012-08-28T07:26:53.043 に答える
1

問題はあなたがやっている:

$currentitem = $domtree->createElement("newWord");
$currentitem = $domtree->appendChild($currentitem);

に変更します

$currentitem = $domtree->createElement("newWord");
$currentitem = $domtree->documentElement->appendChild($currentitem);

これにより、ルート ノードに追加されます。


コードには他にも改善すべき点がいくつかあります。

$wordH=$_GET['varHeb'];
$wordE=$_GET['varEng'];

このコンテンツをサニタイズ/フィルタリングしてください。DOM は、悪意のあるコンテンツが挿入されないようにするのに非常に優れていますが、外部の世界から来るものはすべて、健全性をチェックする必要があります。


$domtree='';

if(!$domtree)
{   

これはかなり無意味です。$domtree空の文字列を作成したため、ifブロックは常にトリガーされます。その部分を削除して、XML をロードするだけです。


    $domtree = new DOMDocument('1.0', 'UTF-8');
    $domtree->formatOutput = true;
    $domtree->load('Dictionary_user.xml');
}

DOMをload使用して文字列またはファイルを作成すると、コンストラクターに入力した引数が破棄され、代わりに文字列またはファイルの xml プロローグにある引数が使用されます。したがって、DOMDocument を新規作成するときにそれらを指定する必要はありません。


    $Dictionary_user = $domtree->documentElement;

これは、追加先のルート ノード ( <xml>) です。


$currentitem = $domtree->createElement("newWord");
$currentitem = $domtree->appendChild($currentitem);

ここでエラーが発生しています。新しい要素を作成し$domtree、ドキュメント全体である に追加します。XPath クエリで$domtreeは、ルート要素など/に追加する必要があります。/xml


$currentitem->appendChild($domtree->createElement('Heb', $wordH));
$currentitem->appendChild($domtree->createElement('Eng',$wordE));

これは期待どおりに機能します。に追加しています<newWord>


$Dictionary_user
    ->childNodes
    ->item(0)
    ->parentNode
    ->insertBefore($currentitem, $Dictionary_user->childNodes->item(0));

ルート要素 ( <xml>) から最初の子要素までトラバースし、次に明らかにルート要素である親に戻ります。したがって、トラバーサル全体は必要ありません。実際、追加要素をルート要素の最初の子の上に移動したい場合を除き<newWord>、ブロック全体はまったく必要ありません。

于 2012-08-28T07:33:03.927 に答える