2012-05-04 21 views
1

XMLファイルにノードを追加するスクリプトを作成しています。これに加えて、私はファイルに組織を扱うために作られた外部dtdを持っています。しかし、私が書いたスクリプトは、ノードを追加し終えたら、空のxmlファイルにdtdを上書きし続けます。これをどうやって止めることができますか?save()がxmlファイルのdtdを上書きしないようにします。

コード:

<?php 

/*Dom vars*/ 
$dom = new DOMDocument("1.0", "UTF-8"); 
$previous_value = libxml_use_internal_errors(TRUE); 
$dom->load('post.xml'); 
libxml_clear_errors(); 
libxml_use_internal_errors($previous_value); 
$dom->formatOutput = true; 
$entry = $dom->getElementsByTagName('entry'); 
$date = $dom->getElementsByTagName('date'); 
$para = $dom->getElementsByTagname('para'); 
$link = $dom->getElementsByTagName('link'); 



/* Dem POST vars used by dat Ajax mah ziggen, yeah boi*/ 
if (isset($_POST['Text'])){ 
$text = trim($_POST['Text']); 

} 
/* 
function post(){ 
    global $dom, $entry, $date, $para, $link, 
    $home, $about, $contact, $text; 
*/ 
    $entryC = $dom->createElement('entry'); 
    $dateC = $dom->createElement('date', date("m d, y H:i:s")) ; 
    $entryC->appendChild($dateC); 

$tab = "\n"; 
$frags = explode($tab, $text); 
$i = count($frags); 
$b = 0; 

while($b < $i){ 

$paraC = $dom->createElement('para', $frags[$b]); 
$entryC->appendChild($paraC); 
$b++; 
} 



$linkC = $dom->createElement('link', rand(100000, 999999)); 
$entryC->appendChild($linkC); 
$dom->appendChild($entryC); 
$dom->save('post.xml'); 

/*} 

post(); 
*/echo 1; 

?> 

答えて

1

これを行うためには、あなたがたDOMImplementaionを使用して空のドキュメントを作成し、渡す

DOMImplementation::createDocumentType 

を使用してDOMDOCUMENTTYPEを作成する必要があるだろうように見えます作成したDOMDocumentTypeを読み込み、読み込んだドキュメントを読み込みます。この投稿:http://pointbeing.net/weblog/2009/03/adding-a-doctype-declaration-to-a-domdocument-in-php.htmlとそのコメントは役に立ちました。

構文解析/検証後、DTDはDOMの一部ではなくなり、ドキュメントをシリアル化する際にPHPがそれを含めることができないため、これが起こっていると思います。

にはがありますか? XMLスキーマは属性を介してリンクできます(リンクはDOMの一部です)。またはRelaxNGがあり、処理命令を介してリンクすることができます。 DTDには、SGMLからのホールドオーバーとしてこれらの手荷物がすべて付属しています。より良い選択肢があります。

+0

私はDTDを使用する必要はありませんが、とにかくそのブログを読んで、それが動作するかどうかを確認します。 – VinceOmega

関連する問題