【问题标题】:How to read an xml file (easy)如何读取 xml 文件(简单)
【发布时间】:2016-06-28 18:53:05
【问题描述】:

我试图在 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>

【问题讨论】:

  • 看起来ReadToNextDescendant 是您自己的类中的一个方法,因为您没有在任何东西上调用它。如果您提供minimal reproducible example,这将非常有帮助。但总的来说,我建议在使用 XML 时使用 LINQ to XML。但是,您的 XML 的当前结构确实很不幸 - 看起来每个元素都应该有 5 个子元素。
  • 查找 XElement 类。它对于这类事情非常有用,并且是 Jon Skeet 在谈到 LINQ to XML 时所指的部分内容。正如 Jon Skeet 所说,您还应该考虑修复您的 XML,以便这些坐标是具有 x 和 y 属性的子元素。
  • 值得注意并补充:您的 XML 不是有效的 XML。

标签: c# xml parsing xml-parsing


【解决方案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 值做一些事情。这段代码是我使用的样板。该代码可能需要一些修补才能适应您的情况。我希望它能为您指明正确的方向!

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2020-02-10
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多