我一直在爲這一整天掙扎,實際上它可能非常簡單......但我是PHP和XML世界的完全初學者,所以可以真的有一些幫助。解析XML:根據IDREF/ID拉取單獨的值
我正在使用SimpleXML來解析我的數據並擁有兩個二級組 - (yearlist)和(eplist)。我有(年)嵌套在裏面(yearlist),它有一個屬性「yid」,在我的DTD中設置爲ID。它還有(年份)嵌套在(年份)內,其中包含更詳細的描述以顯示爲輸出。我有(ep)嵌套在(eplist)中,屬性爲「yearid」(直接與「yid」關聯),在我的DTD中設置爲IDREF。
基本上,當我解析(eplist)的數據時,我想使用(yearname)作爲組頭 - 使用yearid = yid> yearname作爲路徑。
我創建了一個可以幫助我更好地解釋問題的數據示例。
這是我DTD:
<?xml encoding="UTF-8"?>
<!ELEMENT besteplist (yearlist,eplist)>
<!ELEMENT yearlist (year)+>
<!ELEMENT year (yearname)>
<!ATTLIST year
yid ID #REQUIRED>
<!ELEMENT yearname (#PCDATA)>
<!ELEMENT eplist (ep)+>
<!ELEMENT ep (eptitle,eptnumber)>
<!ATTLIST ep
eid ID #REQUIRED
yearid IDREF #IMPLIED>
<!ELEMENT eptitle (#PCDATA)>
<!ELEMENT eptnumber (#PCDATA)>
這裏是我的XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE besteplist SYSTEM "example.dtd">
<besteplist>
<yearlist>
<year yid="y1">
<yearname>1995, Season 1</yearname>
</year>
<year yid="y2">
<yearname>1996, Season 2</yearname>
</year>
<year yid="y3">
<yearname>1997, Season 3</yearname>
</year>
</yearlist>
<eplist>
<ep yearid="y1" eid="e1">
<eptitle>The First Episode</eptitle>
<eptnumber>1</eptnumber>
</ep>
<ep yearid="y2" eid="e2">
<eptitle>Bla bla bla</eptitle>
<eptnumber>21</eptnumber>
</ep>
<ep yearid="y2" eid="e3">
<eptitle>Rar rar rar</eptitle>
<eptnumber>39</eptnumber>
</ep>
<ep yearid="y2" eid="e4">
<eptitle>Tra la la</eptitle>
<eptnumber>45</eptnumber>
</ep>
<ep yearid="y3" eid="e5">
<eptitle>Donkey</eptitle>
<eptnumber>126</eptnumber>
</ep>
</eplist>
</besteplist>
下面是如何想我的輸出例子來看看:
SEASON: 1995, Season 1
EPISODE TITLE: The First Episode
EPISODE NUMBER: 1
SEASON: 1996, Season 2
EPISODE TITLE: Bla bla bla
EPISODE NUMBER: 21
EPISODE TITLE: Rar rar rar
EPISODE NUMBER: 39
EPISODE TITLE: Tra la la
EPISODE NUMBER: 45
SEASON: 1997, Season 3
EPISODE TITLE: Donkey
EPISODE NUMBER: 126
我不認爲這將是多麼有用的張貼我已經嘗試過的代碼,因爲它可能相當無用......我的有設法做的是非常基礎。一旦我有這個下來,我可以進入下一階段...格式化...
我沒有以任何方式附加到SimpleXML,所以如果有人可以建議一個更有效的方式做事情,我都在耳邊。
非常感謝您提前幫助任何花時間幫助我的人。 :)
山姆
針對@michi,我一直坐在試圖找出XPath和在線閱讀各種語法/教程,似乎無法讓我的頭周圍。這是我迄今爲止......但我已經注意到了xpath,因爲它顯然是錯誤的。
<?php
$xml=simplexml_load_file("example.xml") or die("Error: Cannot create object");
foreach($xml->yearlist->children() as $years) {
$xyid=$years[yid];
echo "_____________________________________________<br>";
echo "(yid= " . $xyid . ")<br>";
echo "SEASON: " . $years->yearname . "<br>";
echo "_____________________________________________<br>";
foreach($xml->eplist->children() as $episodes) {
echo "EPISODE TITLE: " . $episodes->eptitle . "<br>";
echo "EPISODE NUMBER: " . $episodes->eptnumber . "<br>";
$xyearid=$episodes[yearid];
echo "(yearid= " . $xyearid . ")<br>";
// echo $xml->xpath('//year[@yid="$episodes[yearid]"]/yearname');
echo "</p>";
}
}
?>
我希望你能引導我走向正確的方向!
感謝 山姆
感謝您的幫助之道 - 這絕對在正確的方向邁出的一步!
我試圖想辦法只顯示季節名稱一次......遇到迭代和數組,但他們都看起來對我來說太複雜了。是否有可能在foreach命令中包含xpath?我想也許如果我在每個季節嵌套foreach集,並使用xpath匹配它可以工作的ID,但我似乎無法讓它顯示元素。我在正確的軌道上嗎?
<?php
$xml=simplexml_load_file("example.xml") or die("Error: Cannot create object");
foreach ($xml->yearlist->year as $season) {
echo "SEASON: " . $season->yearname . PHP_EOL;
foreach ($xml->xpath("//ep[@yearid='$season[yid]']")[0] as $episode) {
echo "EPISODE TITLE: " . $episode->eptitle . PHP_EOL;
echo "EPISODE NUMBER: " . $episode->eptnumber . PHP_EOL;
echo PHP_EOL;
}
}
?>
再次感謝!
你做到了,只要在'foreach'中刪除'[0]',看https://eval.in/465031。有一種我一直在想的替代方式,就像往常一樣,有很多方法可以實現目標。我會在我的答案中詳細說明備選方案。 – michi