我正在尝试将XML字符串中的数据加载到某种结构中,因此一旦加载,我就可以说Data.PropertyName来读取值。
以下代码是将数据加载到结构中的最佳方式吗?
显然调用First()有一个内存命中,所以如果你有子元素的元素会为每个元素调用First()成为一个问题吗?
谢谢
string xml = @"<ROOT>
<ID>1</ID>
<NAME>RF1</NAME>
<STAT>10200</STAT>
<TEST>
<ID>1</ID>
<NAME>BIGUN</NAME>
</TEST>
</ROOT>
";
XElement Data = XElement.Parse(xml);
var Element = (from p in Data.Descendants("ROOT")
select new {
ID = (int)p.Element("ID"),
Test = new {
ID = p.Element("TEST").Descendants("ID").First(),
NAME = p.Element("TEST").Descendants("NAME").First()
},
Stat = p.Element("STAT") }).First();
//Read Element.ID, Element.Test.Name
答案 0 :(得分:3)
您可以使用XmlSerializer
对其进行反序列化吗?
using System;
using System.IO;
using System.Xml.Serialization;
[XmlRoot("ROOT")]
public class MyType
{
[XmlElement("ID")]
public string Id { get; set; }
[XmlElement("NAME")]
public string Name { get; set; }
[XmlElement("STAT")]
public string Stat { get; set; }
[XmlElement("TEST")]
public MyOtherType Nested { get; set; }
}
public class MyOtherType
{
[XmlElement("ID")]
public string Id { get; set; }
[XmlElement("NAME")]
public string Name { get; set; }
}
static class Program
{
static void Main()
{
string xml = @"<ROOT>
<ID>1</ID>
<NAME>RF1</NAME>
<STAT>10200</STAT>
<TEST>
<ID>1</ID>
<NAME>BIGUN</NAME>
</TEST>
</ROOT>";
MyType obj = (MyType) new XmlSerializer(typeof(MyType))
.Deserialize(new StringReader(xml));
Console.WriteLine(obj.Id);
Console.WriteLine(obj.Name);
Console.WriteLine(obj.Stat);
Console.WriteLine(obj.Nested.Id);
Console.WriteLine(obj.Nested.Name);
}
}
答案 1 :(得分:1)
我会去反序列化和Xml属性:更具可读性。
答案 2 :(得分:0)
不,这不是最佳方式,但它可能足够好。
性能最优化的是编写专门用于此的XML解析器,但这当然会包含更多代码。
我不知道为什么你关注First
方法。它会让第一个项目通过,然后停止阅读,所以它不会导致任何问题。当然,XML解析器仍然必须解析所有子节点。