2011-03-27 78 views
1

我有一个数据对象类,它存储了几个属性。一个是文件夹,另一个是该阵列中所有文件的string[]将对象集合(又包含一个集合对象)导出到xml

我需要做的就是写出来的XML,像如下:

<X> 
    <a>dir</a> 
     <b>file</f> 

因此,所有的文件(有每个数据对象的string[]数组),嵌套下面的目录域。

这很容易吗?还是有一个外部库可以很容易地为我做这件事?

感谢

回答

1

使用XML串行做的工作适合你?

using System.Linq; 
using System.Collections.Generic; 
using System.Xml.Serialization; 
using System.IO; 
using System; 

namespace NS 
{ 
    public class Data 
    { 
     public class Nested 
     { 
      public string The  { get; set; } 
      public string[] stuff = {"lazy Cow Jumped Over", "The", "Moon"}; 
     } 

     public List<Nested> Items; 
    } 

    static class Helper 
    { 
     public static string ToXml<T>(this T obj) where T:class, new() 
     { 
      if (null==obj) return null; 

      using (var mem = new MemoryStream()) 
      { 
       var ser = new XmlSerializer(typeof(T)); 
       ser.Serialize(mem, obj); 
       return System.Text.Encoding.UTF8.GetString(mem.ToArray()); 
      } 
     } 

     public static T FromXml<T>(this string xml) where T: new() 
     { 
      using (var mem = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml))) 
      { 
       var ser = new XmlSerializer(typeof(T)); 
       return (T) ser.Deserialize(mem); 
      } 
     } 

    } 

    class Program 
    { 
     public static void Main(string[] args) 
     { 
      var data = new Data { Items = new List<Data.Nested> { new Data.Nested {The="1"} } }; 
      Console.WriteLine(data.ToXml()); 

      var clone = data.ToXml().FromXml<Data>(); 
      Console.WriteLine("Deserialized: {0}", !ReferenceEquals(data, clone)); 
      Console.WriteLine("Identical: {0}", Equals(data.ToXml(), clone.ToXml())); 
     } 
    } 
} 

将输出

<?xml version="1.0" encoding="utf-8"?> 
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Items> 
    <Nested> 
     <stuff> 
     <string>lazy Cow Jumped Over</string> 
     <string>The</string> 
     <string>Moon</string> 
     </stuff> 
     <The>1</The> 
    </Nested> 
    </Items> 
</Data> 
Deserialized: True 
Identical: True 

有一些cornercases和陷阱特别是与现有的XSD工作时,但这一切都非常好,小道和其他记录。

+0

我实际上使用过xmlserializer,但遇到了不允许的字符等问题。似乎像YMMV。我没有Xml的专业知识,需要保留这些字符。这似乎工作。 – dotnetdev 2011-03-27 21:19:50

+0

@dotnetdev:禁止xmlserializer中的错误,只要所有组成字段/属性都是可序列化的,您的里程应该**不会变化。 XML标准允许在所有内容中表示所有字符,并且框架知道如何。我假设你指向读取另一端(而不是.NET)的XML的问题?在这种情况下:使用真正的XML解析器或阅读关于XML字符编码和实体引用的一些文档。 – sehe 2011-03-27 21:29:57

2

你的意思是这样的:

var myxml = new XElement(yourObj.FolderName); 
myxml.Add(new XElement("Files",yourObj.Files.Select(x => new XElement("File",x)));