現在、MVCスタイルのOOPベースのPHPプロジェクトで作業しています。 私のプロジェクトでは、XMLを作成/送信/受信/処理する必要があります。PHPとXMLの作成:間違った親のノード
今私はDOMDocumentでXML構造を作成することに大きな問題があります。 がまたは値属性なし 毎回私は、すべてのノードが、その後、このノードであれば子になり、新しいXMLノードを作成します!言い換えれば
:私はこの空のノードの子をbeeingて、その後、すべてのノードなし空のXMLノードを作成することはできません!今
この問題はしばらくの間、バグ私を、私は本当に私はXMLの作成に今取り扱っております方法が必要です。 解決策は見つかりませんでしたが、同様の問題がありました。
test.phpを::
ここ<?php
include "Handler/XmlHandler.php";
$xmlHandler=new XmlHandler();
$xmlHandler->CreateNewXmlInstance();
$root = $xmlHandler->CreateRootNode('RootNode');
$l1 = $xmlHandler->AppendNodeWithChild($root, "NodeLevel1", "Text1 - This node one has text");
$l2 = $xmlHandler->AppendNodeWithChild($root, "NodeLevel2", "Text2 - Next node Level3 level is not gonna have text");
$l21 = $xmlHandler->AppendNodeWithChild($l2, "NodeLevel2_1", "Text2_1 - This node will be a child of Level2, everything fine");
$l3 = $xmlHandler->AppendNodeWithChild($root, "NodeLevel3", "");
$l4 = $xmlHandler->AppendNodeWithChild($root, "NodeLevel4", "Text4 - This node should be on same level like 3, 2 & 1, but instead it's a child of Level 3 (?!?!?!?!)");
echo "<p style='display:none;'>".$xmlHandler->SaveXml()."</p>";
?>
は、XML-ハンドラ・クラスである私はXMLを作成するために使用
このPHPは、XML-Requestを作成し、私のXmlHandlerクラスをテストします-request-構造(私はここで、クラスのneccessary一部を掲載)
XmlHandler.php:
<?php
class XmlHandler{
private $xml;
/**
*
* Constructor
*
*/
function __construct()
{
$this->xml=null;
}
//[...]
/*
* Custom XML-Creator Functions
*
*/
public function CreateNewXmlInstance(){
/*********************************************/
/** XML DOM example of building XML Request **/
/*********************************************/
$this->xml = new DOMDocument('1.0', 'UTF-8');
return $this->xml;
}
public function CreateRootNode($name){
$rootElement = $this->xml->appendChild($this->xml->createElement($name));
return $rootElement;
}
public function AppendNodeWithChild($node, $childName, $childText){
$result = $node->appendChild($this->xml->createElement($childName));
if(null != $childText && !empty($childText)){
$result->appendChild($this->xml->createTextNode($childText));
}
return $result;
}
public function SetNodeAttributes($node, $nameAndValues){
if(null != $nameAndValues && sizeof($nameAndValues) > 0){
foreach($nameAndValues as $name => $value){
$this->SetNodeAttribute($node, $name, $value);
}
}
}
public function SetNodeAttribute($node, $name, $value){
$node->setAttribute($name, $value);
}
public function SaveXml(){
return $this->xml->saveXML();
}
//[...]
}
?>
これが結果です:
<!-- ?xml version="1.0" encoding="UTF-8"? -->
<rootnode>
<nodelevel1>Text1 - This node one has text</nodelevel1>
<nodelevel2>Text2 - Next node Level3 level is not gonna have text
<nodelevel2_1>Text2_1 - This node will be a child of Level2, everything fine</nodelevel2_1>
</nodelevel2>
<nodelevel3>
<nodelevel4>Text4 - This node should be on same level like 3, 2 & 1, but instead it's a child of Level 3 (?!?!?!?!)</nodelevel4>
</nodelevel3>
</rootnode>
しかし、理論的には、そのようなsomethignがあるはずです:あなたが見ることができるように
<!-- ?xml version="1.0" encoding="UTF-8"? -->
<rootnode>
<nodelevel1>Text1 - This node one has text</nodelevel1>
<nodelevel2>Text2 - Next node Level3 level is not gonna have text
<nodelevel2_1>Text2_1 - This node will be a child of Level2, everything fine</nodelevel2_1>
</nodelevel2>
<nodelevel3/>
<nodelevel4>Text4 - This node should be on same level like 3, 2 & 1, but instead it's a child of Level 3 (?!?!?!?!)</nodelevel4>
</rootnode>
:私が持っていたとき、何かが間違っていましたレベル3の新しい作成ノード!:
$l3 = $xmlHandler->AppendNodeWithChild($root, "NodeLevel3", "");
$l4 = $xmlHandler->AppendNodeWithChild($root, "NodeLevel4", "Text4 - This node should be on same level like 3, 2 & 1, but instead it's a child of Level 3 (?!?!?!?!)");
0の値を設定していません
属性を設定したり、新しいノードを作成して値を設定したりする限り、すべて正常です。 しかし、純粋な空のノードも作成する必要があるいくつかの状況があります。
私の質問は:
は、私がここで間違って何をしているのですか?
PHPが何か問題を起こしていますか?
たぶん私のブラウザはXMLの悪い準備、しかし、発信XML要求を構築し、正しく送信し、間違いが何かをあるしていますか?
もしそうなら、どのように私はしかしXML要求を確認することができますか?
編集Nrを。2:
私の質問/元の投稿は何とか変更されました。 上記の例は、もう少し理解しやすい例です。 少なくとも私はそう望みます。
こんにちはMiKeNekoとご回答をありがとうございました。 私のコードはすでにあなたの答えに記述されているようです。 私が言ったように、私は開発中です** OOP **。 しかし、それでもまだ、私はnode2でないノード1での問題を取得します。 –
元の投稿にクラスコードを追加しました。私はエラーがどこにあるかは分かりません。あなたのステップがあります :// CHECK '新ルートノード(リクエスト)が、最終的にノード1 // CHECK 設定するには、クライアント値をノード2を追加// CHECK (リクエスト)にノード1を追加しますノードの2 // CHECK 印刷アウト全体のルートノード// CHECK は、その後、あなたは魔法// CHECK' または私は何かが足りないのですがやりましたか? –
私は答えを更新して、役立つかどうか確認しています。 あなたは '$ this'を逃したと思います。 私の更新されたコードをご覧ください。 – MiKeNeko