2012-02-13 213 views
0

我想用C#(.net 2.0)反序列化XML文件。反序列化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类。

请帮帮我。 ;-)

+3

我们展示你的代码。我们不能盲目。 – Polynomial 2012-02-13 08:58:58

+2

您尝试将此XML序列化为** what **类? – gideon 2012-02-13 08:59:06

回答

3

下工作正常,我:

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 
        ); 
       } 
      } 

     } 
    } 
} 
+0

谢谢,完美无缺。 – Gunnar 2012-02-13 09:49:17

0

这应该工作......尤其

[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 
+1

在你的'Elements'类中,你不能拥有一个名为'Elements'的属性。 – 2012-02-13 09:16:34

+0

@Darin我在修改中修复了 – 2012-02-13 09:18:06