【问题标题】:Is this the most efficient way of loading xml values into a structure?这是将 xml 值加载到结构中的最有效方法吗?
【发布时间】:2009-10-07 11:49:22
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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);
        }
    }
    

    【讨论】:

    • 哇,谢谢。以前从未见过这种方法。你会说这比 LINQ 更有效还是非常相似?如果您在类中有一个与 XMLElement 相关但未出现在 XML 中的属性,它会引发异常还是只是将该属性的值设置为 null?
    • @Jon:我希望它比 LINQ 效率稍低,因为它必须使用反射来找出从 XML 中读取的内容。您必须分析代码才能确定。您可以使用 XmlElement 属性中的 IsNullable 属性来指定 XML 中是否需要该元素。
    【解决方案2】:

    我会选择反序列化和 Xml 属性:更具可读性。

    【讨论】:

    • 您能否提供示例或示例链接?
    【解决方案3】:

    不,这不是最理想的方式,但它可能已经足够好了。

    最优化的性能是编写您自己的专门用于此目的的 XML 解析器,但这当然需要更多的代码。

    我不知道你为什么关心First 方法。它只会让第一项通过然后停止阅读,因此不会引起任何问题。当然,XML 解析器仍然必须解析所有子项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 2012-12-09
      • 2015-10-22
      • 1970-01-01
      • 2011-09-05
      相关资源
      最近更新 更多