這篇好像之前help有問過我的樣子
只是當時沒有時間去看看要怎麼做,現在暑假到了,所以剛好就研究一下
XML是延伸的標記檔案,最近很多應用軟體都用XML當作中繼描述來用
(像是儲存資料、設定檔等)
可能有些人在增加Content的時候,會發現到除了SpriteBatch之類的東西還會看到XML但是要怎麼始用他呢? 怎麼把它運用在XNA理面?
XNA所有Content都是把他編譯成XNB檔案(聲音部分除外)
所以我們也必須要把XML檔案資訊抓取出來再把他寫(ContentTypeWriter)到XNB中
然後在執行中的時後再把它讀(ContentTypeReader)出來
首先先開啟一個新的專案,我把它取名為"XMLtest"作為專案名稱
我們新增一個XML檔案在Content中,檔名為"XML.xml"
打開來以後可以看到內容為
<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
<!-- TODO: replace this Asset with your own XML asset data. -->
<Asset Type="System.String"></Asset>
</XnaContent>
再來我們為了要做一些測試,所以我們就新增一些測試的數值在XML中
變數的話記得他是用標籤的方式格式為
<變數名稱>數值</變數名稱>
修正過後為
<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
<Asset Type="XMLPipeline.XMLContent">
<name>test</name>
<map>terain.bmp</map>
</Asset>
</XnaContent>
再來我們來寫一個字訂的Content Processor來將XML的檔案寫入XNB中
在方案那邊,我們按下右鍵,增加一個新的專案,選擇空白的類別庫(他會把這個專案編譯成dll檔)
增加好空白類別庫以後,在來新增一下reference,因為預設的沒有包含XNA freamwork,所以我們要新增一些reference
Microsoft.Xna.Framework
Microsoft.Xna.Framework.Content.Pipeline
Microsoft.Xna.Framework.Game
需要這三個reference
加入以後我們要加入兩個類別分別取名為,XMLContent.cs以及XMLWriter.cs
在XMLContent.cs中,就是對應到XML資料
namespace XMLPipeline
{
public class XMLContent
{
public string name = null;
public string map = null;
}
}
這邊要注意的就是他的名字要跟XML的標籤對應,也就是看你的XML標籤變數名稱是甚麼,這邊對應的類別field也是要依樣
再來就是要寫XMLWriter.cs的內容,這邊做的事情就是要寫入XML的資料到XNB中
namespace XMLPipeline
{
[ContentTypeWriter]
class XMLWriter : ContentTypeWriter<XMLContent>
{
protected override void Write(ContentWriter output, XMLContent value)
{
output.Write(value.name);
output.Write(value.map);
}
public override string GetRuntimeReader(TargetPlatform targetPlatform)
{
return "XMLtest.setReader, XMLtest";
}
}
}
這邊比較要注意的就是GetRuntimeReader的function,他是用來對應到Reader的部分
回傳值就是"專案名稱.類別名稱,專案名稱"
以上就是XMLPipeline的部分,接下來回到XMLtest的專案中
我們先新增幾個類別,叫做set.cs以及setReader.cs
set.cs就是用來儲存XML的資料,這邊儲存的資料,是從Reader中抓出來的資料
namespace XMLtest
{
class set
{
public string name = null;
public string map = null;
}
}
PS : 本程式碼沒有顯示輸出結果,請善用中斷點檢查變數內容

版面怪怪的~~可能出現怪符號!! 這個我也研究了一下~竟然一定要在別的project裡面產生dll才可以用~~不能直接在同一個專案裡~~有點不方便 而且是不是可以把texture和xml內容寫在同一個xnb裡阿 感覺要寫在一起需要重寫importer~
畢竟XNA還是用XNB當作中介暫存 XML的讀取他提供XML的importor,只是自己要寫一個Processor來去做修改,看看要存甚麼內容 不過XNB應該是一個檔案就一個XNB吧
請問你這份CODE有存sln檔嗎?可以的話,希望可以跟你要...不然我目前都是用System.xml,沒辦法產生xnb到Release跟Debug資料夾內... 感激不盡
這份CODE是有存的 不過我只是寫一個很簡單的SAMPLE檔 就是讀取XML的資料而已 如果上面的還是看不太懂的話 你可以留下你的信箱,我在MAIL給你
*****
*****
>回傳值就是"專案名稱.類別名稱,專案名稱" 這段應該是"命名空間.類別名稱, 專案名稱"才是。 預設回傳是"MyNamespace.MyContentReader, MyGameAssembly",測試結果也相符。 ----- 昨天才發現xna裡面有XML Content… 本來是用System.Xml處理的,看來要大幅改寫底層了… 感謝你的文章^^
用XNA所提供的XML Content有一定的格式來儲存資料,如果地圖一份的話、道具一份如此類推這樣要寫很多Processor@@"
sorry.. 更正一下,那天腦殘打錯字… 應該是"命名空間.類別名稱, 「組件」名稱"
您好,我想要看您的XML範例,但是載點掛了,請問能否寄給我嗎?謝謝您。
http://140.126.21.8/~teexit/xna/code/XMLtest.rar 上面的網址
to WELL4 不好意思我不太清楚你的意思...