C # - эффективно используя XmlReader - PullRequest
2 голосов
/ 18 марта 2012

Хорошо, у меня есть этот 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 ]

2 голосов
/ 18 марта 2012

Я не могу найти что-то явно не так с вашим решением. Включение 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);
0 голосов
/ 18 марта 2012

"тонн XML-файлов" не проблема; это становится проблемой только тогда, когда у вас есть огромный мегалит одного XML-файла. Так как у вас этого нет, используйте DOM. XmlDocument или XDocument справятся с этим тривиально, и их гораздо проще использовать, чем XmlReader. Если вы сопоставляете классы (или можете это сделать), XmlSerializer будет хорошим вариантом.

Общеизвестно, что XmlReader сложно использовать без обширных знаний и / или отладки (и наоборот, XmlWriter очень прост).

...