这是将xml值加载到结构中的最有效方法吗?

时间:2009-10-07 11:49:22

标签: c# linq c#-3.0 linq-to-xml

我正在尝试将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

3 个答案:

答案 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解析器仍然必须解析所有子节点。