2016-08-09 8 views
2

現在、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 &amp; 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 &amp; 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:

私の質問/元の投稿は何とか変更されました。 上記の例は、もう少し理解しやすい例です。 少なくとも私はそう望みます。

答えて

0

皆、誰かがこの問題を手伝ってくれました。 がここに会話されています

彼:タグが

(彼らはすべて小文字に変更されてきたので)私が間違っている:はい、をエコーた後、XMLが乱雑ようですそれはのファイルに保存するのではなく、に保存する代わりに、

彼:と出力がさえ

私をフォーマットするべきではありません。私はより良いビュー

彼のためにそれ自身をした:これは$の生の出力でありますxmlHandler- > SaveXml()Meは

<?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 &amp; 1, but instead it's a child of Level 3 (?!?!?!?!)</NodeLevel4> 
</RootNode> 

フォーマットされた出力を有効にした後:A FTER ファイルそれをプリントアウトし、私はあなたと同じ結果を得ました。

結論:

は、今私は、ファイルにsaveXml出力を書いてきました。 結果は、彼が彼は私に言った同じようです。

だからめちゃくちゃだったのですか?

私はエコーとFirefox経由HTML-ソースコードを通してそれをチェックをブラウザにXMLをプリントアウトするのに十分だろうthoght。

あなたは私の最初の記事で見ることができるように、私は(私はどのように他を知らなかったので)何とか私のXML-創造の結果をプリントアウトするために、エコー...

echo "<p style='display:none;'>".$xmlHandler->SaveXml()."</p>"; 

を使用しました。

したがってXML-作成は(今から私はもうあなたの助けに頼ることはできません)を起動し、私は応答サーバから取得するエラーがどこかにあるから、完全な成功を収めました!

0

あなたのコードは、クラスで$this通話

ラッピングものが含まれているため、クラスでクラスの

class XMLHelper { 
    /* 
    * Custom XML-Creator Functions 
    * 
    */ 

    private $xml; 

    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(); 
    } 
} 

ラップ物事を自分のヘルパー関数をラップ変数にプログラムの必要性を修正するために$this呼び出しを行います。

その後、クラスを新しいノード

$test = new XMLHelper(); 
$test->CreateNewXmlInstance(); 
$request = $test->CreateRootNode("request"); 
$node1 = $test->AppendNodeWithChild($request, "node1", null); 
$node2 = $test->AppendNodeWithChild($node1, "node2", null); 
$test->SetNodeAttributes($node2, array(
    "client" => "This is a testing value" 
)); 

echo $test->saveXml(); 

//Output: 
// <?xml version="1.0" encoding="UTF-8"?> 
// <request> 
//  <node1> 
//   <node2 client="This is a testing value"/> 
//  </node1> 
// </request> 

を初期化するコードが正しい順序で実行する必要があることに注意してください。

  1. は次に(リクエスト)
  2. が最後にノード1
  3. を構成するノードのクライアント値2
  4. 印刷にノード2を追加したノード1を追加し、ルートノード(リクエスト)全体のルートノードから
  5. 次に、あなたは魔法
を行ってきました

あなたのウェブブラウザでもPHPに問題はありません。

ルートノードを初期化せず、作成したノードをルートノードに正しく追加していないことが原因の可能性があります。

PHPによるXML検証については、this linkを参照してください。

DOMDocumentには、検証のために組み込まれた関数があります。

編集2016年8月10日ここで

はあなたの例改訂コード

class SpecificXmlHandler extends XmlHandler{ 

    /** 
    * Constructor 
    * 
    */ 

    private $errorCounter; 
    private $xmlUrl; 

    //Declare the root first 
    private $root; 

    function __construct() 
    { 
     parent::__construct(); 
     $this->errorCounter=0; 
     $this->xmlUrl=Configuration::XML_REQUEST_URL; 
    } 


    //[...] 

    /** 
    * Action Functions 
    */ 

    public function GetStaticData($requestName, $requestFilterNamesAndValues){ 
     $xml = $this->BuildStaticDataRequest($requestName, $requestFilterNamesAndValues); 
     echo "<p style='display:none'>" . $xml. "</p>";  //Request 
     $response = $this->ExecuteRequest($this->xmlUrl, $xml, null, false); 
     echo "<p style='display:none'>" . $response . "</p>"; //Resonse 

     //[...] 
    } 

    //[...] 

    /** 
    * Request Building Functions 
    */ 

    public function BuildStaticDataRequest($requestName, $requestFilterNamesAndValues){ 

     $this->CreateNewXmlInstance(); 
     //$root = $this->CreateRootNode('Request'); 
     //Use the root node you have created in the constructor by using $this 
     $this->root = $this->CreateRootNode('Request'); 
     //Generate Header (Source-Node) 
     $this->GenerateHeadData($this->root); 

     //[...] 

     return $this->SaveXml(); 
    } 

    public function GenerateHeadData($root){ 

     $clientID=Configuration::XML_CLIENT; 


     //Here the Node1 & Node2 creation 
     $node1 = $this->AppendNodeWithChild($root, "node1", null); 
     $node2 = $this->AppendNodeWithChild($node1, "node2", null); 

     $this->SetNodeAttributes($node2 , array(
      "Client" =>$clientID 
     )); 

     //Change it to return the whole root 
     return $root; 

    } 

[...] 


} 

クラスに変数を作成し、作成したプライベート変数を参照するために$thisを使用してくださいます。

+0

こんにちはMiKeNekoとご回答をありがとうございました。 私のコードはすでにあなたの答えに記述されているようです。 私が言ったように、私は開発中です** OOP **。 しかし、それでもまだ、私はnode2でないノード1での問題を取得します。 –

+0

元の投稿にクラスコードを追加しました。私はエラーがどこにあるかは分かりません。あなたのステップがあります :// CHECK '新ルートノード(リクエスト)が、最終的にノード1 // CHECK 設定するには、クライアント値をノード2を追加// CHECK (リクエスト)にノード1を追加しますノードの2 // CHECK 印刷アウト全体のルートノード// CHECK は、その後、あなたは魔法// CHECK' または私は何かが足りないのですがやりましたか? –

+0

私は答えを更新して、役立つかどうか確認しています。 あなたは '$ this'を逃したと思います。 私の更新されたコードをご覧ください。 – MiKeNeko

関連する問題