【问题标题】:Deserialize XML反序列化 XML
【发布时间】:2012-03-04 16:35:12
【问题描述】:

我想在 C# (.net 2.0) 中反序列化一个 XML 文件。

XML 的结构是这样的:

<elements>
   <element>
     <id>
       123
     </id>
     <Files>
       <File id="887" description="Hello World!" type="PDF">
         FilenameHelloWorld.pdf
       </File>
     </Files>
   </element>
<elements>

当我尝试在 C# 中反序列化此结构时,文件名出现问题,该值始终为 NULL,即使我尝试对 File 类进行编码也是如此。

请帮助我。 ;-)

【问题讨论】:

  • 向我们展示您的代码。我们不禁失明。
  • 您尝试将此 XML 序列化为 what 类?

标签: asp.net .net xml serialization c#-2.0


【解决方案1】:

以下对我来说很好用:

public class element
{
    [XmlElement("id")]
    public int Id { get; set; }

    public File[] Files { get; set; }
}

public class File
{
    [XmlAttribute("id")]
    public int Id { get; set; }

    [XmlAttribute("description")]
    public string Description { get; set; }

    [XmlAttribute("type")]
    public string Type { get; set; }

    [XmlText]
    public string FileName { get; set; }
}

class Program
{
    static void Main()
    {
        using (var reader = XmlReader.Create("test.xml"))
        {
            var serializer = new XmlSerializer(typeof(element[]), new XmlRootAttribute("elements"));
            var elements = (element[])serializer.Deserialize(reader);

            foreach (var element in elements)
            {
                Console.WriteLine("element.id = {0}", element.Id);
                foreach (var file in element.Files)
                {
                    Console.WriteLine(
                        "id = {0}, description = {1}, type = {2}, filename = {3}", 
                        file.Id,
                        file.Description,
                        file.Type,
                        file.FileName
                    );
                }
            }

        }
    }
}

【讨论】:

    【解决方案2】:

    这应该可以...

    [XmlRoot("elements")]
    public class Elements {
        [XmlElement("element")]
        public List<Element> Items {get;set;}
    } 
    public class Element { 
        [XmlElement("id")]
        public int Id {get;set;}
        [XmlArray("Files")]
        [XmlArrayItem("File")]
        public List<File> Files {get;set;}
    }
    public class File {
        [XmlAttribute("id")]
        public int Id {get;set;}
        [XmlAttribute("description")]
        public string Description {get;set;}
        [XmlAttribute("type")]
        public string Type {get;set;}
        [XmlText]
        public string Filename {get;set;}
    }
    

    特别注意使用不同的属性表示不同的含义。已验证(在修复 xml 的结束元素之后):

    string xml = @"..."; // your xml, but fixed
    
    Elements root;
    using(var sr = new StringReader(xml))
    using(var xr = XmlReader.Create(sr)) {
        root = (Elements) new XmlSerializer(typeof (Elements)).Deserialize(xr);
    }
    string filename = root.Items[0].Files[0].Filename; // the PDF
    

    【讨论】:

    • 在您的 Elements 类中,您不能拥有名为 Elements 的属性。
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2011-06-24
    相关资源
    最近更新 更多