我是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#中将此类结构加载到内存的最佳做法是什么?
答案 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)