2013-07-10 19 views
0

我需要編寫一個函數來從XML文件中獲取數據。編寫一個函數來解析來自XML文件的數據

這是我第一次嘗試做這樣的事情。我想對待它,就像我會對待一個MySQL數據庫(是的,我是一個新手)。

的XML的結構如下所示:

$xmlstr = <<<XML 
<?xml version='1.0' standalone='yes'?> 
<PlayerCount value="2"> 
    <Position value="Left"> 
     <Action value="Hit"> 
      <Range BBIdx="2" model="Math">0.653</Range> 
      <Range BBIdx="3" model="Math">0.341</Range> 
      <Range BBIdx="4" model="Math">0.216</Range> 
     </Action> 
     <Action value="Punch"> 
      <Range BBIdx="0" model="Math">1.000</Range> 
      <Range BBIdx="1" model="Math">1.000</Range> 
      <Range BBIdx="2" model="Math">0.498</Range> 
      <Range BBIdx="3" model="Math">0.256</Range> 
      <Range BBIdx="4" model="Math">0.168</Range> 
     </Action> 
     <Action value="Defend"> 
      <Range BBIdx="1" model="Math">1.000</Range> 
      <Range BBIdx="2" model="Math">1.000</Range> 
      <Range BBIdx="3" model="Math">0.503</Range> 
      <Range BBIdx="4" model="Math">0.341</Range> 
     </Action> 
    </Position> 
    <Position value="Right"> 
     <Action value="Hit"> 
      <Range BBIdx="2" model="Math">0.828</Range> 
      <Range BBIdx="3" model="Math">0.416</Range> 
      <Range BBIdx="4" model="Math">0.278</Range> 
     </Action> 
     <Action value="Punch"> 
      <Range BBIdx="1" model="Math">1.000</Range> 
      <Range BBIdx="2" model="Math">0.623</Range> 
      <Range BBIdx="3" model="Math">0.309</Range> 
      <Range BBIdx="4" model="Math">0.217</Range> 
     </Action> 
     <Action value="HitDefend"> 
      <Range BBIdx="2" model="Math">0.628</Range> 
      <Range BBIdx="3" model="Math">0.313</Range> 
      <Range BBIdx="4" model="Math">0.204</Range> 
     </Action> 
     <Action value="PunchDefend"> 
      <Range BBIdx="1" model="Math">0.755</Range> 
      <Range BBIdx="2" model="Math">0.380</Range> 
      <Range BBIdx="3" model="Math">0.192</Range> 
      <Range BBIdx="4" model="Math">0.127</Range> 
     </Action> 
    </Position> 
</PlayerCount> 
<PlayerCount value="3"> 
    <Position value="Up"> 
     <Action value="Hit"> 
      <Range BBIdx="2" model="Math">0.455</Range> 
      <Range BBIdx="3" model="Math">0.237</Range> 
      <Range BBIdx="4" model="Math">0.158</Range> 
     </Action> 
     <Action value="Punch"> 
      <Range BBIdx="0" model="Math">0.931</Range> 
      <Range BBIdx="1" model="Math">0.702</Range> 
      <Range BBIdx="2" model="Math">0.372</Range> 
      <Range BBIdx="3" model="Math">0.178</Range> 
      <Range BBIdx="4" model="Math">0.117</Range> 
     </Action> 
     <Action value="Defend"> 
      <Range BBIdx="1" model="Math">1.000</Range> 
      <Range BBIdx="2" model="Math">0.725</Range> 
      <Range BBIdx="3" model="Math">0.352</Range> 
      <Range BBIdx="4" model="Math">0.235</Range> 
     </Action> 
    </Position> 
    <Position value="Left"> 
     <Action value="Hit"> 
      <Range BBIdx="2" model="Math">0.576</Range> 
      <Range BBIdx="3" model="Math">0.273</Range> 
      <Range BBIdx="4" model="Math">0.189</Range> 
     </Action> 
     <Action value="Punch"> 
      <Range BBIdx="0" model="Math">1.000</Range> 
      <Range BBIdx="1" model="Math">0.862</Range> 
      <Range BBIdx="2" model="Math">0.434</Range> 
      <Range BBIdx="3" model="Math">0.209</Range> 
      <Range BBIdx="4" model="Math">0.150</Range> 
     </Action> 
     <Action value="Defend"> 
      <Range BBIdx="1" model="Math">1.000</Range> 
      <Range BBIdx="2" model="Math">0.844</Range> 
      <Range BBIdx="3" model="Math">0.439</Range> 
      <Range BBIdx="4" model="Math">0.291</Range> 
     </Action> 
     <Action value="HitDefend"> 
      <Range BBIdx="2" model="Math">0.429</Range> 
      <Range BBIdx="3" model="Math">0.212</Range> 
      <Range BBIdx="4" model="Math">0.142</Range> 
     </Action> 
     <Action value="PunchDefend"> 
      <Range BBIdx="0" model="Math">0.693</Range> 
      <Range BBIdx="1" model="Math">0.530</Range> 
      <Range BBIdx="2" model="Math">0.269</Range> 
      <Range BBIdx="3" model="Math">0.133</Range> 
... 
<PlayerCount value="3"> 
... 

我希望能夠在<Range>標籤之間可以方便地訪問數字。

喜歡的東西拿到這裏

<PlayerCount value="2"> 
<Position value="Left"> 
<Action value="Hit"> 
<Range BBIdx="2" model="Math"> 

如果這將是我的MySQL會做一些這樣的數字:

$query = "SELECT range FROM modeling WHERE BB='' AND POS='' AND OPP='"; 

任何幫助是非常欣賞。我已經浪費了2天的時間來看SimpleXML PHP類,但我不知道如何在屬性中搜索,就像在這種情況下一樣。我相信,解決這個問題不會超過2分鐘。

如果我有getnumber('file-xml','playercount','position','action','bbidx')這樣的函數,

在此先感謝。

這是我寫的代碼,但我不知道如何使它與屬性工作:

$xml = new SimpleXMLElement($input); 

$res = $xml->xpath('/Playercount[.=2]/Position[.=Left]/Action[.=Hit]/Range[.=2]'); 

while(list(, $node) = each($result)) { 
    echo 'result: ',$node,"\n"; 
} 

不幸的是預期,這並不工作。

這是我想現在使用的代碼:

<?php 


$x = <<<XML 
<?xml version='1.0' standalone='yes'?> 
<document> 
<PlayerCount value="2"> 
    <Position value="Left"> 
     <Action value="Hit"> 
      <Range BBIdx="2" model="Math">0.653</Range> 
      <Range BBIdx="3" model="Math">0.341</Range> 
      <Range BBIdx="4" model="Math">0.216</Range> 
     </Action> 
     <Action value="Punch"> 
      <Range BBIdx="0" model="Math">1.000</Range> 
      <Range BBIdx="1" model="Math">1.000</Range> 
      <Range BBIdx="2" model="Math">0.498</Range> 
      <Range BBIdx="3" model="Math">0.256</Range> 
      <Range BBIdx="4" model="Math">0.168</Range> 
     </Action> 
     <Action value="Defend"> 
      <Range BBIdx="1" model="Math">1.000</Range> 
      <Range BBIdx="2" model="Math">1.000</Range> 
      <Range BBIdx="3" model="Math">0.503</Range> 
      <Range BBIdx="4" model="Math">0.341</Range> 
     </Action> 
    </Position> 
    <Position value="Right"> 
     <Action value="Hit"> 
      <Range BBIdx="2" model="Math">0.828</Range> 
      <Range BBIdx="3" model="Math">0.416</Range> 
      <Range BBIdx="4" model="Math">0.278</Range> 
     </Action> 
     <Action value="Punch"> 
      <Range BBIdx="1" model="Math">1.000</Range> 
      <Range BBIdx="2" model="Math">0.623</Range> 
      <Range BBIdx="3" model="Math">0.309</Range> 
      <Range BBIdx="4" model="Math">0.217</Range> 
     </Action> 
     <Action value="HitDefend"> 
      <Range BBIdx="2" model="Math">0.628</Range> 
      <Range BBIdx="3" model="Math">0.313</Range> 
      <Range BBIdx="4" model="Math">0.204</Range> 
     </Action> 
     <Action value="PunchDefend"> 
      <Range BBIdx="1" model="Math">0.755</Range> 
      <Range BBIdx="2" model="Math">0.380</Range> 
      <Range BBIdx="3" model="Math">0.192</Range> 
      <Range BBIdx="4" model="Math">0.127</Range> 
     </Action> 
    </Position> 
</PlayerCount> 
</document> 
XML; 

$xml = simplexml_load_string($x); 

//$result = (string)$xml->xpath("//PlayerCount[@value='2']/Position[@value='Left']/Action[@value='Hit']/Range[@BBIdx='2' and @model='Math']")[0]; 

list($result) = (string)$xml->xpath("//document/PlayerCount[@value='2']/Position[@value='Left']/Action[@value='Hit']/Range[@BBIdx='2' and @model='Math']"); 
var_dump($result); 

?> 

的var_dump返回NULL。怎麼來的?

+1

你忘了添加你寫過這個問題的PHP代碼。 – andrewsi

+0

[XPath](http://en.wikipedia.org/wiki/XPath)是你的朋友。 – moonwave99

+0

我已經投票了你的評論。我將它添加到andrewsi中。 – KingBOB

回答

1

你的XPath是幾乎沒有,用@的屬性,但:

$result = (string)$xml->xpath("//PlayerCount[@value='2']/Position[@value='Left']/Action[@value='Hit']/Range[@BBIdx='2' and @model='Math']")[0]; 

這將PHP> = 5.4工作,並返回第一選擇的值。
看到它的工作:http://codepad.viper-7.com/fI1Dh6

隨着PHP < 5.4:

list($result) = $xml->xpath(...); 
$result = (string)$result; 

或做...

$result = $xml->xpath("//PlayerCount[@value='2']/Position[@value='Left']/Action[@value='Hit']/Range[@BBIdx='2' and @model='Math']"); 
$result = (string)$result[0]; 

看到它的工作:http://codepad.viper-7.com/2DhUiN

+0

感謝您的回答!不過,我有PHP 5.3.5。我該如何解決這個問題? – KingBOB

+0

@Giorgio:更新PHP?如果這是不可能的,請參閱我的編輯... – michi

+0

對不起michi,我試過你的PHP <5.4的代碼,它不會返回任何東西。我在編輯問題以添加我嘗試使用的代碼。 – KingBOB