如何读取xml文件(简单)

时间:2016-06-28 18:53:05

标签: c# xml parsing xml-parsing

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

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

它有效,我能够从绘制的蓝色坐标中提取数据。但是,我再次尝试了wall_horizo​​ntal,它没有用。因此,我得出结论,我需要某种新功能,或者可能采用不同的方法。但是,我对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>

1 个答案:

答案 0 :(得分:1)

如果可以,我真的建议将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值做点什么。这个代码是我使用的锅炉板。代码可能需要一些修改来处理您的情况。我希望它能指出你正确的方向!