2017-02-16 94 views
0

我已經將我的PHP代碼包含在我從中檢索數據的XML文件片段中。在XML文檔中查找屬性並使用PHP輸出子節點

我想顯示XML文件中的數據,與我如何將它用作ID一樣。在ID中,它使用ID作爲索引,但是我發現它不能用作日期。

我的第一個想法是隻使用xPath並將其保留爲此,但我想將數據格式設置爲類似以保持一致性。

作爲PHP和XML的初學者,我將不勝感激任何可以進一步學習語言或格式風格的洞察力或文檔。

我遇到的問題是找到已輸入的相關屬性的索引值,並以ID搜索等格式單獨輸出。

<?php 
if($_GET["SearchChoice"] == "ID Search"){ #WORKING FINDS THE VALUE OF DATA NEEDED 
    $xml=simplexml_load_file("XMLtest.xml") or die("Error: Cannot create object"); 
    $passID = intval($_GET["IDsend"]); 
    if ($passID !== 0){ 
     $passID = $passID - 1; 
    } 
    #echo $xml['date']; 
    #echo var_dump((string)$xml['date']); 
    $attr = $xml->finances[$passID]->attributes(); 
    echo "Date: "; 
    echo $attr['date']; 
    echo $xml->finances[$passID]->day . ",<br>Projection: "; 
    echo $xml->finances[$passID]->projection . ",<br>Recommended Staff: "; 
    echo $xml->finances[$passID]->recommendedStaff . ",<br>Staff Wages: "; 
    echo $xml->finances[$passID]->staffWages . ",<br>Actual: "; 
    echo $xml->finances[$passID]->actual . "<br>"; 
} 
elseif($_GET["SearchChoice"] == "Date Search") { 
    $xml=simplexml_load_file("XMLtest.xml") or die("Error: Cannot create object"); 
    $passDate = strval($_GET["DateSend"]); 
    $nodes = $xml->xpath("/january/finances[@date='". $passDate . "']"); # Instead of xpath possiblity: loop through to find date then output it similar to ID Search? 
    print_r($nodes); 
} 
else { 
    echo "Error 1 <br>"; 
    echo $_GET["SearchChoice"]; 
} 

這裏是XML的一部分:

<?xml version="1.0" encoding="UTF-8"?> 
<january> 
    <finances id="1" date="01-01-2016"> 
     <projection>414</projection> 
     <recommendedStaff>20</recommendedStaff> 
     <staffWages>100</staffWages> 
     <actual>250</actual> 
    </finances> 
    <finances id="2" date="02-01-2016"> 
     <year>2016</year> 
     <month>01</month> 
     <day>02</day> 
     <projection>124</projection> 
     <recommendedStaff>8</recommendedStaff> 
     <staffWages>150</staffWages> 
     <actual>250</actual> 
    </finances> 
    <finances id="3" date="03-01-2016"> 
     <projection>687</projection> 
     <recommendedStaff>20</recommendedStaff> 
     <staffWages>150</staffWages> 
     <actual>250</actual> 
    </finances> 
    <finances id="4" date="04-01-2016"> 
     <projection>587</projection> 
     <recommendedStaff>15</recommendedStaff> 
     <staffWages>150</staffWages> 
     <actual>250</actual> 
    </finances> 
    <finances id="5" date="05-01-2016"> 
     <projection>124</projection> 
     <recommendedStaff>5</recommendedStaff> 
     <staffWages>150</staffWages> 
     <actual>250</actual> 
    </finances> 
    <finances id="6" date="06-01-2016"> 
     <projection>874</projection> 
     <recommendedStaff>22</recommendedStaff> 
     <staffWages>150</staffWages> 
     <actual>250</actual> 
    </finances> 
</january> 
+0

你還沒有解釋你想解決什麼問題,以及爲什麼提供的代碼不起作用。看到http://stackoverflow.com/help/how-to-ask – miken32

+0

@ miken32原諒我,我已經澄清了我的帖子。 –

+0

沒有理由不能以完全相同的方式使用日期,只需確保日期的格式完全相同,因爲XML將其視爲字符串。 – Mike

回答

0
$xml=simplexml_load_file("XMLtest.xml") or die("Error: Cannot create object"); 

switch ($_GET["SearchChoice"]) 
{ 
    case 'ID Search': 
    $nodes = $xml->finances[$passID]; 
    break; 
    case 'Date Search': 
    $passDate = strval($_GET["DateSend"]); 
    $nodes = $xml->xpath("/january/finances[@date='". $passDate . "']"); 
    if ($nodes) 
     $nodes = array_shift($nodes); // First match 
    break; 
    default: 
    $nodes = NULL; 
} 

if ($nodes) // Don't care how we got them 
{ 
    echo $nodes->day . ",<br>Projection: "; 
    // etc 
} 

這將加載在啓動該文件,然後創建基於您的搜索選擇一個節點(存儲在$節點)(熟悉你自己用switch語句 - 非常有用,尤其是在使用或不使用「break」命令時)。

在switch語句之後,無論您如何獲取它,都有一個節點。這是編碼的好習慣 - 條件是「保重」,從現在開始不是問題。

實際上,對這兩個選項使用xpath可能是一個更好的主意 - 不同代碼路徑之間的最小差異使得調試和維護更容易。

+1

您能否解釋一下PHP的這個新手和任何XML類型的格式是什麼?因此在案件陳述中,這沒有任何意義。 –

+0

好點。我引入了一些早先的評論,並擴大了我的答案,包括一點解釋。在代碼中思考更容易! – Mike