我加载这个xml文件了吗?

时间:2010-12-23 11:29:03

标签: c# xml

我正在使用C#加载XML文件,但我不认为我是以最好的方式做到这一点,如果有人验证我这样做的方式是可以接受的,我真的很感激或指出我正确的方向,以更好的方式。

我只发布了我加载XML文件的部分内容,但我将这种技术用于所有内容,

XDocument doc = XDocument.Load(xmldir);
var layers = doc.Document.Descendants("Layer");
foreach (var layer in layers)
{
    if (layer.Attribute("Name").Value == "Terrain")
    {
        LoadTerrain(layer);
    }
}

// The load terrain function:
public void LoadTerrain(XElement elements)
{
    var items = elements.Descendants("Items");
    var element = elements.Descendants("CustomProperties").Descendants("Property");

    float tileSize = 0;
    string tileTexture = "";
    foreach (var property in element)
    {
        if (property.Attribute("Name") != null)
        {
            string name = property.Attribute("Name").Value;
            if (name == "TileSize")
            {
                tileSize = float.Parse(property.Attribute("Description").Value);
            }
            else if (name == "Texture")
            {
                tileTexture = property.Attribute("Description").Value;
            }
        }
    }

    PhysicShape shape = new PhysicShape(world, JabActor.BodyType.STATIC);
    shape.TextureDir = tileTexture;
    shape.TileSize = tileSize;
    shape.Initialize();
    foreach (var item in items)
    {
        var parts = item.Descendants("Item");

        foreach (var part in parts)
        {
            if (part.Name == "Item")
            {
                element = part.Descendants("Position");
                float posx = float.Parse(element.Elements("X").ElementAt(0).Value);
                float posy = float.Parse(element.Elements("Y").ElementAt(0).Value);

                ////element = part.Descendants("Rotation");
                float rot = float.Parse(part.Elements("Rotation").ElementAt(0).Value);

                element = part.Descendants("Scale");
                float width = float.Parse(element.Elements("X").ElementAt(0).Value);
                float height = float.Parse(element.Elements("Y").ElementAt(0).Value);


                shape.AddRectangle(new Vector3(posx, -posy, 0), new Vector2(width, height), rot);
            }
        }
    }

    shape.FinalizeVertices();
    AddNode(shape);
}

这是XML文件:http://medsgames.com/levelg.xml

3 个答案:

答案 0 :(得分:3)

这不错,但最好的方法是XML序列化。您可以创建一个XSD架构,您可以使用xsd.exe SDK工具创建C#代码,然后您可以使用~3行代码读取或写入XML。网上有大量关于此的信息。

答案 1 :(得分:2)

如果它有效,并按照您的需要执行,我会说它是对的。您可以为您的对象实现IXmlSerializable,并利用一些有用的序列化/反序列化框架代码,而不是自己解析xml。

首先创建架构并使用xsd.exe生成类,或者查找IXmlSerializable

答案 2 :(得分:1)

您可以尝试将XML反序列化为C#对象。试试这篇优秀的帖子:   Deserialize XML