C# - 有效地使用XmlReader

时间:2012-03-18 08:11:10

标签: c# xml xmlreader

好的,我有这个XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<Item>
    <Name>Iron Repeater</Name>
    <AutoReuse>true</AutoReuse>
    <UseAnimation>19</UseAnimation>
    <UseTime>19</UseTime>
    <Width>50</Width>
    <Height>18</Height>
    <Shoot>1</Shoot>
    <UseAmmo>1</UseAmmo>
    <UseSound>5</UseSound>
    <Damage>39</Damage>
    <ShootSpeed>11</ShootSpeed>
    <NoMelee>true</NoMelee>
    <Value>200000</Value>
    <Ranged>true</Ranged>
    <Rarity>4</Rarity>
    <Knockback>2.5</Knockback>

    <CraftStack>1</CraftStack>

    <CraftItem1>Wood</CraftItem1>
    <CraftValue1>1</CraftValue1>

    <CraftTile1>18</CraftTile1>

    <FinishCrafting/>

</Item>

它的读法与此类似:

foreach (string s in API.itemFiles)
{
    using (XmlReader reader = XmlReader.Create(s))
    {
        string aTile;
        string aStack;
        string item;
        string iName;
        int tile;
        int stack;
        int iStack;
        reader.MoveToContent();
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element)
            {
                if (reader.IsStartElement())
                {
                    switch (reader.Name)
                    {
                        //Le cases here
                    }
                }
            }
        }
    }
}

API.itemFiles是:

public static string[] itemFiles = Directory.GetFiles(itemSave, "*.xml");

每当我尝试以这种方式读取XML文件时,它似乎不会将元素内容(我将readElementContentAsXX();)解析为变量或其他任何内容,但它似乎确实找到了元素。

我有什么问题吗?我还能改进什么吗?如果有任何其他方法来读取XML(它将计划有大量的XML文件;我需要它有效)请说出来!

谢谢!

2 个答案:

答案 0 :(得分:2)

我找不到任何明确错误的解决方案。当我测试它时,启用reader.Name

我建议使用更传统的XML格式。而不是编号元素,您将它们移动到子元素:

<Item>
    ...
    <Stacks>
        <Stack>
            <Item>Wood</Item>
            <Value>1</Value>
            <Tile>18</Tile>
        </Stack>
    </Stacks>
</Item>

然后,您可以使用XML对象序列化来解析文件。它不会出错。

public class Item
{
    public string Name;
    public bool AutoReuse;
    public int UseAnimation;
    public int UseTime;
    public int Width;
    public int Height;
    public int Shoot;
    public int UseAmmo;
    public int UseSound;
    public int Damage;
    public int ShootSpeed;
    public bool NoMelee;
    public int Value;
    public bool Ranged;
    public int Rarity;
    public decimal Knockback;
    public List<Stack> Stacks;
}

public class Stack
{
    public string Item;
    public int Value;
    public int Tile;
}
XmlSerializer x = new XmlSerializer(typeof(Item));
var item = (Item) x.Deserialize(steam);

答案 1 :(得分:0)

“大量的XML文件”不是问题;当你有一个单一XML文件的庞大巨石时,它只会成为一个问题。由于您没有,请使用DOM。 XmlDocument或XDocument都可以轻松处理这个问题,并且比XmlReader更容易使用。如果你要映射到类(或可以做),XmlSerializer将是一个不错的选择。

如果没有广泛的知识和/或调试(相反,XmlWriter是轻而易举的),XmlReader很难强大地使用。