2013-02-10 118 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