如何读取xml文件(简单)

本文关键字:xml 文件 简单 读取 何读取 | 更新日期: 2023-09-27 17:53:00

我试图在c# visual studio中读取xml,但不知道如何做得很好。首先,我尝试了一个if块,像这样:

if (ReadToNextDescendant("painted_blue"))
{
  // access the coordinates inside and do some work
  // this works
}

它起作用了,我能够从涂成蓝色的坐标中提取数据。然而,我再次尝试了walls_horizontal,它没有工作。因此,我得出结论,我需要某种新功能,或者可能是一种不同的方法。但是,我不熟悉XML解析。首先,我不明白ReadToDescendant到底做了什么,为什么它第二次没有工作。有人能给我指个正确的方向吗?

<painted_blue>
    (0,0)
    (1,0)
    (1,5)
    (2,2)
</painted_blue>
<walls_horizontal>
    (1,2)
    (1,3)
    (1,4)
    (2,1)
    (2,2)
</walls_horizontal>
<walls_vertical>
    (1,1)
    (1,2)
    (1,3)
    (2,0)
    (2,1)
</walls_vertical>

如何读取xml文件(简单)

如果可以的话,我真的建议将XML格式更改为如下内容:

<walls_horizontal>
    <coord x="1" y="2" />
    <coord x="1" y="3" />
    <coord x="1" y="4" />
</walls_horizontal>

为坐标提供节点将使管理更容易。

下面是一些代码

public static XmlReaderSettings ReaderSettings()
{
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.CloseInput = true;
    settings.IgnoreComments = true;
    settings.IgnoreProcessingInstructions = true;
    settings.IgnoreWhitespace = true;
    return settings;
}

…当你在文件

中读取
    Stream stream = File.Open(filePath, FileMode.Open);
    var reader = XmlReader.Create(stream, XmlHelper.ReaderSettings());

    if (!reader.IsEmptyElement)
            {
                string tagName = reader.Name;
                while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement))
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        switch (reader.Name)
                        {
                            case "wall_horizontal":
                                var coord = new Coord(reader);
                                break;
                        }
                    }
                }
            }

在自定义坐标类中执行如下操作:

public Coord(XmlReader reader)
    {
        if (reader == null) throw new ArgumentNullException("reader");
        if (!reader.IsEmptyElement)
        {
            string tagName = reader.Name;
            while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement && reader.Name == "coord"))
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                        case "coord":
                            var x = reader.GetAttribute("x");
                            var y = reader.GetAttribute("y");
                            break;
                    }
                }
        }
        }
    }

然后处理你的x和y值。这个代码是我使用的锅炉板。代码可能需要进行一些修改以适应您的情况。我希望它能给你指明正确的方向!