2013-10-31 146 views
1

我想用PHP構建XML文檔。用PHP輕鬆創建XML文檔

我選擇了DOMDocument,我知道我必須使用像createElementcreateTextNode,appendChild等方法來構建我的XML。

我這是怎麼產生的只有一個節點包含車輛信息的XML:

<?php 
$doc = new DOMDocument ('1.0', 'utf-8'); 
$vehicles = $doc->createElement ("Vehicles"); 

$vehicle = $doc->createElement("Vehicle"); 
$vehicle_num = $doc->createElement("Number"); 
$vehicle_desc = $doc->createElement("Description"); 
$vehicle_year = $doc->createElement("Year"); 
$vehicle_make = $doc->createElement("Make"); 
$vehicle_model = $doc->createElement("Model"); 
$vehicle_color = $doc->createElement("Color"); 

$vehicle_num->appendChild($doc->createTextNode("AW2CM31Y8")); 
$vehicle_year->appendChild($doc->createTextNode("2013")); 
$vehicle_make->appendChild($doc->createTextNode("VOLKSWAGEN")); 
$vehicle_model->appendChild($doc->createTextNode("NEW BEETLE")); 
$vehicle_color->appendChild($doc->createTextNode("Black")); 

$vehicle_desc->appendChild($vehicle_year); 
$vehicle_desc->appendChild($vehicle_make); 
$vehicle_desc->appendChild($vehicle_model); 
$vehicle_desc->appendChild($vehicle_color); 

$vehicle->appendChild($vehicle_num); 
$vehicle->appendChild($vehicle_desc); 

$vehicles->appendChild($vehicle); 
$doc->appendChild ($vehicles); 

header ("Content-type: text/xml"); 
echo $doc->saveXML(); 

但是,如果我想建立一個xml什麼用說不僅包含車輛信息100個節點,而且其他節點高於和低於它。這個過程太費力了。

那麼,有沒有一種簡單的方法創建節點,並在PHP中使用xml爲它們添加值?我關心的是我應該編寫的代碼行數。

+2

我不知道,如果* *樂觀是問你們這樣一個技術問題,正確的術語。XML僅僅是一種序列化格式,所以不應只將創建作爲「代碼」編寫,而應首先將數據分離爲它自己的數據結構。然後編寫基於數據結構創建XML的代碼。這是我誠實給予的最好建議。 – hakre

+0

@hakre現在修改我的問題。 –

+0

你可以寫成純xml?或者,如果你有一個數據源作爲XML導出,使用for(each)循環? – TiMESPLiNTER

回答

1

首先想到的是,你已經得到了代碼重複。你可能想要減少它。這可以通過將重複代碼移入它自己的函數來完成。

要做到這一點,PHP已關閉。讓我們排隊:

你有一個車輛的集合,每輛車只有屬性和值。所以你添加一個屬性的車輛。順便說一下,createElement確實已經將文本作爲值,以便您不需要創建文本節點。因此,讓我們將重複的代碼包裝到函數中,然後調用這些函數來創建XML。那已經 - 通過參數化 - 顯示您的結構。剛剛的函數的定義(第一部分)和應用那些(第二部分)之間的不同:

<?php 
/** 
* Create XML Document with PHP in an easy way 
* 
* @link http://stackoverflow.com/q/19702911/367456 
*/ 

/** 
* @param DOMNode $node 
* @return DOMDocument 
*/ 
$doc = function (DOMNode $node = NULL) { 
    return $node ? ($node->ownerDocument ? : $node) : new DOMDocument(); 
}; 

/** 
* @param DOMElement $element 
* @param string $property 
* @param string $text 
* @return DOMElement the element the proeprty was added to 
*/ 
$prop = function (DOMElement $element, $property, $text) { 
    return $element->appendChild(
     $element->ownerDocument->createElement($property, $text) 
    ); 
}; 

/** 
* @param DOMNode $element 
* @param string $name 
* @return DOMElement 
*/ 
$element = function (DOMNode $element, $name) use ($doc) { 
    return $element->appendChild(
     $doc($element)->createElement($name) 
    ); 
}; 

所以,畢竟這些功能已經確定,到第二部分:

$prop(
    $vehicle = $element(
     $vehicles = $element(
      $doc() 
      , 'Vehicles' 
     ) 
     , 'Vehicle' 
    ) 
    , "Number" 
    , "AW2CM31Y8" 
); 

$prop(
    $vehicle 
    , "Year" 
    , "2013" 
); 

$prop(
    $vehicle 
    , "Make" 
    , "VOLKSWAGEN" 
); 

$prop(
    $vehicle 
    , "Model" 
    , "NEW BEETLE" 
); 

$prop(
    $vehicle 
    , "Color" 
    , "Black" 
); 

Et瞧。這揭示了一些結構。代碼重複也被刪除。剩下的唯一的事情就是終於呼應的結果出來:

header("Content-type: text/xml"); 
echo $doc($vehicles)->saveXML(); 

如果你看看你甚至可以讀取它確實不扭轉的數據結構來創建XML代碼。所以接下來的事情就是利用某種遍歷,但首先需要定義一個數據結構,而不僅僅是到目前爲止已經完成的代碼結構的定義(並且應該已經被使用了爲你)。

在線例子:https://eval.in/59090

+0

@dskanth:不要刪除該答案示例代碼中的換行符/縮進,因爲它實際上顯示了結構。你可能會發現它很冗長,我用它來使這更加突出。由於您還沒有數據結構,因此請注意,此代碼/結構實際上是一箇中間步驟。 – hakre

+0

它確定。感謝你的回答。工作很好。 –

+1

那麼,通常建議將數組轉換爲XML轉換,這樣您可以進一步減少代碼重複,一個也可以更新XML結構的高級示例是:[如何使用數組更新SimpleXMLElement](http://stackoverflow.com/a/14839271/367456) - 記住這個例子並不是那麼冗長。 – hakre

0

我建議您創建具有相同結構的xml,並將其用作模板。所以你只需要填寫這個XML。

1

在我看來,你真正想要的是一個對象的XML序列化,對其中創建的文檔進行某種控制。

爲此你可能想看看XMLSerializer的項目 - https://bitbucket.org/schmijos/xmlserializer

這將採取一系列/ PHP對象,並將其序列化爲XML。

+0

感謝您的鏈接..看起來很有用 –