2013-02-10 45 views
-1

我一直在砸我的頭靠在牆上兩天試圖找出如何讓PHP到編碼我想要的XML。我嘗試了SimpleXML,發現有嚴重的侷限性,所以對於 現在我正在使用DomDocument來滿足我的需求。我的問題是非常基本的,什麼是正確的語法?如何PHP DomDocument創建屬性?

我從數據庫中檢索代碼,然後將其渲染爲xml。 XML結構必須與我要發佈的格式完全相同。問題在於涉及到屬性。輸出有三個屬性,需要用不同的值重複十二次。 我的問題是試圖找出如何呈現屬性,什麼代碼是必要的。

這裏是XML:

<inits> 
<version>18.05.04_EP1</version> 
<source>Live</source> 
<lowid>265067</lowid> 
<highid>265068</highid> 
<ql>300</ql> 
<name>Ofab Shark Mk 1</name> 
<inits slider="DEF&gt;===========][&lt;AGG" percent="100" init="430" /> 
<inits slider="DEF&gt;==========][=&lt;AGG" percent="90" init="530" /> 
<inits slider="DEF&gt;=========][==&lt;AGG" percent="81" init="630" /> 
<inits slider="DEF&gt;========][===&lt;AGG" percent="72" init="730" /> 
<inits slider="DEF&gt;=======][====&lt;AGG" percent="63" init="830" /> 
<inits slider="DEF&gt;======][=====&lt;AGG" percent="54" init="930" /> 
<inits slider="DEF&gt;=====][======&lt;AGG" percent="45" init="1030" /> 
<inits slider="DEF&gt;====][=======&lt;AGG" percent="36" init="1130" /> 
<inits slider="DEF&gt;===][========&lt;AGG" percent="27" init="1290" /> 
<inits slider="DEF&gt;==][=========&lt;AGG" percent="18" init="1590" /> 
<inits slider="DEF&gt;=][==========&lt;AGG" percent="9" init="1890" /> 
<inits slider="DEF&gt;][===========&lt;AGG" percent="0" init="2190" /> 

</inits> 

注意Inits包含的屬性,百分比和init。在這個例子中,它將顯示12次,這是從數據和php計算得出的。 以下是我目前使用的代碼。注意:我正在跳過數據和計算功能並手動填寫數據。

$root = $doc->createElement('inits'); 
$root = $doc->appendChild($root); 

$version = $doc->createElement('version'); 
$version = $root->appendChild($version); 
$versiontext = $doc->createTextNode($patchNum); 
$versiontext = $version->appendChild($versiontext); 

$source = $doc->createElement('source'); 
$source = $root->appendChild($source); 
$sourcetext = $doc->createTextNode('live'); 
$sourcetext = $source->appendChild($sourcetext); 

$xlowid = $doc->createElement('lowid'); 
$xlowid = $root->appendChild($xlowid); 
$xlowidtext = $doc->createTextNode($lowid); 
$xlowidtext = $xlowid->appendChild($xlowidtext); 

$xhighid = $doc->createElement('highid'); 
$xhighid = $root->appendChild($xhighid); 
$xhighidtext = $doc->createTextNode($highid); 
$xhighidtext = $xhighid->appendChild($xhighidtext); 

$xql = $doc->createElement('ql'); 
$xql = $root->appendChild($xql); 
$xqltext = $doc->createTextNode($ql); 
$xqltext = $xql->appendChild($xqltext); 

我在哪裏何去何從拿到3個屬性的工作,完全像上面的XML例子。 謝謝。

+0

如果你沒有得到答案,提高你的問題。這是第一次有嚴重的問題,你沒有問你關心的是什麼。你只是靠運氣得到答案。投票結束。 – hakre 2013-02-10 21:45:25

+0

可能的重複[用PHP和SimpleXML對XML進行故障編碼](http://stackoverflow.com/questions/14791894/trouble-encoding-xml-with-php-and-simplexml) – hakre 2013-02-10 21:45:39

+0

沒有什麼比從新手上拿回分離點。第一個問題與SIMPLEXML有關。當我意識到這是一種死衚衕的方法時,我發佈了關於DOMDocumen的信息,這使得它成爲一個不同的問題,儘管相同的數據被歸因於它。如果我想要這些數據用於JSON呢?那樣也會重複嗎?我不這麼認爲,但感謝提示。我很高興我找到了這個網站。 – 2013-02-12 21:02:03

回答

0

要設置屬性,請使用$some_node->setAttribute("name","value")。根據需要重複所有屬性。

另外請注意,您可以鏈函數調用:

$root = $doc->appendChild($doc->createElement('inits')); 
$root->appendChild($doc->createElement('version',$patchNum)); 
$root->appendChild($doc->createElement('source',$sourcetext)); 
$root->appendChild($doc->createElement('lowid',$lowid)); 
$root->appendChild($doc->createElement('highid',$highid)); 
$root->appendChild($doc->createElement('ql',$ql)); 
for($i=11;$i>=0;$i--) { 
    $node = $root->appendChild($doc->createElement('inits')); 
    $node->setAttribute("slider","DEF>".str_repeat("=",$i)."][".str_repeat("=",11-$i)."<AGG"); 
    $node->setAttribute("percent",floor($i/11*100)); 
    $node->setAttribute("init",$i>3 ? 430+(11-$i)*100 : 1290+(3-$i)*300); 
} 
+0

是的,謝謝。你搖滾! – 2013-02-10 03:00:22

+0

*如果該屬性不存在,它將被創建。* - 並且可鏈接。 'createElement'允許直接設置值。請注意。 – hakre 2013-02-10 21:05:37

+0

@hakre的確如此。我通常將DOMDocument等同於JavaScript DOM方法,所以我忘記了。 – 2013-02-10 21:36:16