如何阅读列表<>从使用C#的XML文件? (基于XNA的问题)

时间:2011-10-25 11:59:40

标签: c# xml list xna

我是XML和XNA的新手,并且遇到了一个绊脚石,以便读取我正在输出的列表,以存储具有多个不同图层的图块地图

我的XML看起来像这样(只是一个示例):

<XnaContent xmlns:Maps="TileEditorLibrary.Maps">
 <Asset Type="Maps:TileMap">
    <R>
      <Item>
        <C>
          <Item>
            <E>1</E>
            <ID>8</ID>
            <B>8</B>
            <H />
            <T />
          </Item>
          <Item>
            <E>1</E>
            <ID>8</ID>
            <B>8</B>
            <H />
            <T />
          </Item>
        </C>
      </Item>
    </R>
  </Asset>
</XnaContent>

我阅读它的代码看起来像这样,但我很想知道下一步该去哪里:

public void LoadContent(XDocument doc, TileMap myMap)
    {
        XDocument mapDoc = doc;
        TileMap map = myMap;

        foreach (XElement element in mapDoc.Element("R").Elements("Item").Elements("C"))
        {
             foreach (XElement mapValue in mapDoc.Element("Item").Elements())
                {
                    if (mapValue.Name.Equals("E"))
                    {
                    //do something
                    }
                    else if (mapValue.Name.Equals("ID"))
                    {
                    }
                    else if (mapValue.Name.Equals("B"))
                    {
                    }
                    else if (mapValue.Name.Equals("H"))
                    {
                    }
                    else if (mapValue.Name.Equals("T"))
                    {
                    }
                }
        }
    }

目前我正在运行应用程序以查看它是否正在使文档正常并且能够解析信息但是它正在抛出空对象引用

如果这看起来很模糊,我很抱歉,但由于我对XML的经验不足,我不确定其他任何信息可能会对任何潜在的顾问有所帮助

如果还有其他任何可能有用的请求,我会尝试解释

非常感谢

百里

2 个答案:

答案 0 :(得分:2)

你应该做的是阅读XML serialization and deserialization 这样,您就可以创建一个表示XML的类,并直接对其进行反序列化,而无需任何XML解析。

Her e是如何做到的一个例子。

答案 1 :(得分:1)

这可能会让你有所思考:

public void LoadContent(XDocument doc, TileMap myMap)
{
    var lookup = new Dictionary<string, Action<string>>()
    {
        { "E", v => { Console.WriteLine("E  = " + v); } },
        { "ID", v => { Console.WriteLine("ID = " + v); } },
        { "B", v => { Console.WriteLine("B  = " + v); } },
        { "H", v => { Console.WriteLine("H  = " + v); } },
        { "T", v => { Console.WriteLine("T  = " + v); } },
    };

    var actions =
        from e in doc.Root
            .Element("Asset")
            .Element("R")
            .Elements("Item")
            .Elements("C")
        from mv in e
            .Elements("Item")
            .Elements()
        let name = mv.Name.ToString()
        let value = mv.Value
        select new Action(() => lookup[name](value));

    foreach (var a in actions)
        a.Invoke();
}