C#newbie:将重复的XML读取到内存中

Roe*_*ler 2 c# xml

我是C#的新手.我正在构建一个应用程序,该应用程序使用元素列表来保存XML文件.我的XML文件的结构如下:

<Elements>
    <Element>
        <Name>Value</Name>
        <Type>Value</Type>
        <Color>Value</Color>
    </Element>
    <Element>
        <Name>Value</Name>
        <Type>Value</Type>
        <Color>Value</Color>
    </Element>
    <Element>
        <Name>Value</Name>
        <Type>Value</Type>
        <Color>Value</Color>
    </Element>
</Elements>
Run Code Online (Sandbox Code Playgroud)

我有<100个这样的项目,这是一个单一的列表(所以我认为数据库解决方案有点矫枉过正,甚至是SQLite).当我的应用程序加载时,我想将这个元素列表读取到内存中.目前,在浏览网页后,我正在使用XmlTextReader.

然而,也许我正在以错误的方式使用它,我逐个标记地读取数据,因此期望标签处于特定顺序(否则代码将变得混乱).我想要做的是阅读完整的"元素"结构并按名称从中提取标签.我确信这是可能的,但是怎么样?

为了澄清,主要区别在于我今天使用XmlTextReader的方式,它不能容忍诸如标签错误顺序之类的场景(例如Type在某个Element中的Name之前).

在C#中将此类结构加载到内存中的最佳实践是什么?

Jon*_*eet 10

真的很容易在LINQ做XML.你在使用.NET 3.5吗?这是一个示例:

using System;
using System.Xml.Linq;
using System.Linq;

class Test
{
    [STAThread]
    static void Main()
    {
        XDocument document = XDocument.Load("test.xml");

        var items = document.Root
                            .Elements("Element")
                            .Select(element => new {
                                Name = (string)element.Element("Name"),
                                Type = (string)element.Element("Type"),
                                Color = (string)element.Element("Color")})
                            .ToList();

        foreach (var x in items)
        {
            Console.WriteLine(x);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能想要创建自己的数据结构来保存每个元素,但您只需要更改"选择"调用即可使用它.


Bad*_*aro 5

您没有使用XmlDocument的任何特殊原因?

XmlDocument myDoc = new XmlDocument()
myDoc.Load(fileName);

foreach(XmlElement elem in myDoc.SelectNodes("Elements/Element"))
{
    XmlNode nodeName = elem.SelectSingleNode("Name/text()");
    XmlNode nodeType = elem.SelectSingleNode("Type/text()");
    XmlNode nodeColor = elem.SelectSingleNode("Color/text()");

    string name = nodeName!=null ? nodeName.Value : String.Empty;
    string type = nodeType!=null ? nodeType.Value : String.Empty;
    string color = nodeColor!=null ? nodeColor.Value : String.Empty;

    // Here you use the values for something...
}
Run Code Online (Sandbox Code Playgroud)