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

时间:2009-07-23 13:31:53

标签: 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>

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

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

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

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

5 个答案:

答案 0 :(得分:10)

在LINQ to 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);
        }
    }
}

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

答案 1 :(得分: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...
}

答案 2 :(得分:1)

听起来像XDocument,XElement可能更适合这项任务。它们可能没有XmlTextReader的绝对速度,但对于你的情况,它们听起来很合适,这将使得处理固定结构变得更加容易。解析元素会像这样工作:

XDocument xml;

foreach (XElement el in xml.Element("Elements").Elements("Element")) {
     var name = el.Element("Name").Value;
     // etc.
}

你甚至可以对Linq有所了解:

XDocument xml;

var collection = from el in xml.Element("Elements").Elements("Element")
                 select new { Name = el.Element("Name").Value,
                              Color = el.Element("Color").Value,
                              Type = el.Element("Type").Value
                            };


foreach (var item in collection) {
    // here you can use item.Color, item.Name, etc..
}

答案 3 :(得分:1)

您可以使用XmlSerializer类(http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

    public class Element
{
    public string Name { get; set; }
    public string Type { get; set; }
    public string Color { get; set; }
}

class Program
{

    static void Main(string[] args)
    {
        string xml =
            @"<Elements>
<Element>
    <Name>Value</Name>
    <Type>Value</Type>
    <Color>Value</Color>
</Element>(...)</Elements>";

XmlSerializer serializer = new XmlSerializer(typeof(Element[]), new XmlRootAttribute("Elements"));
        Element[] result = (Element[])serializer.Deserialize(new StringReader(xml));}

答案 4 :(得分:0)