2013-02-05 75 views
1

我知道,對於這個話題噸帖子的,但因爲我的職位期間讀取兩天,沒有什麼工作,我決定問這裏。 我有一個XML(Level01.xml)文件中像這樣如何通過XML的XDocument的XElement屬性在C#切換

<map version="1.0"> 
<tileset> 
    <image source="....> 
</tileset> 
<layer name="background"> 
    <data encoding="csv"> 
    3,3,3,3,3,3,3, 
    3,3,3,3,3,3,3, 
    3,3,3,3,3,3,3, 
    3,3,3,3,3,3,3 
    </data> 
</layer> 
<layer name="walls"> 
    <data encoding="csv"> 
    182,182,182,182,182,8,8, 
    182,8,182,8,8,8,8, 
    182,182,182,182,182,8,8, 
    182,8,182,8,8,8,8, 
    </data> 
</layer> 
</map> 

它是一種(瓦片)地圖與不同層次,我希望把它收回去XNA。因此,我想從各層的數據讀入string[] 這是我試過,但它不會爲第二string[] walldata工作,我絕對絕望,因爲我不明白爲什麼

public class LevelXmlReader 
{ 
    public string[] backgroundData; 
    public string[] wallData; 

    LevelXmlReader() 
    { 
     XDocument doc = XDocument.Load(@"Level/Level01.xml"); 
     foreach (XElement layer in doc.Element("map").Descendants("layer")) 
     { 

      var lay = doc.Element("map").Element("layer"); 
      var layName = lay.Attribute("name").Value; 
      switch (layName) 
      { 
       case "background": 
        { 
         backgroundData = lay.Element("data").Value.Split(','); 
        } 
        break; 
       case "walls": 
        { 
         wallData = lay.Element("data").Value.Split(','); 
        } 
        break; 
      } 

     } 

    } 

} 

當我嘗試繪製wallData,總是有ExceptionError「對象引用未設置爲對象的實例」。

回答

3

你的循環內您聲明

var lay = doc.Element("map").Element("layer"); 

這是不必要的,因爲你已經擁有了獨特的層。您需要完全刪除該行並使用foreach循環中的layer變量。在循環的內部現在看起來應該是這樣

foreach (XElement layer in doc.Element("map").Descendants("layer")) 
{ 
    switch (layer.Attribute("name").Value) 
    { 
     case "background":  
      backgroundData = layer.Element("data").Value.Split(','); 
      break; 

     case "walls": 
      wallData = layer.Element("data").Value.Split(','); 
      break; 
    } 
} 

在代碼中,你總是抓住同一層兩次,而不是通過他們加強。

+0

謝謝,這工作 –

+0

向前並接受答案即可。如果你一直問問題而沒有給出正確的答案,人們就會因此而煩惱 – Nevyn

+0

當然!對不起... –

2

您使用的是foreach遍歷所有layer標籤。但是在循環內部,你沒有使用它們。相反,您總是通過doc.Element("map").Element("layer")訪問第一層。

+0

太謝謝你了...這正是我的錯誤:d –

1

更換

var lay = doc.Element("map").Element("layer"); 

var lay = layer; 

你忽略了循環變量,而只使用第一個元素。

1

試試這個

public class LevelXmlReader 
{ 
    public string[] backgroundData; 
    public string[] wallData; 

    LevelXmlReader() 
    { 
     XDocument doc = XDocument.Load(@"Level/Level01.xml"); 
     foreach (XElement layer in doc.Element("map").Descendants("layer")) 
     { 
      var layName = layer.Attribute("name").Value; 
      switch (layName) 
      { 
       case "background": 
        backgroundData = layer.Element("data").Value.Split(','); 
        break; 

       case "walls": 
        wallData = layer.Element("data").Value.Split(','); 
        break; 
      } 
     } 
    } 
}