我有一个数据对象类,它存储了几个属性。一个是文件夹,另一个是该阵列中所有文件的string[]
。将对象集合(又包含一个集合对象)导出到xml
我需要做的就是写出来的XML,像如下:
<X>
<a>dir</a>
<b>file</f>
因此,所有的文件(有每个数据对象的string[]
数组),嵌套下面的目录域。
这很容易吗?还是有一个外部库可以很容易地为我做这件事?
感谢
我有一个数据对象类,它存储了几个属性。一个是文件夹,另一个是该阵列中所有文件的string[]
。将对象集合(又包含一个集合对象)导出到xml
我需要做的就是写出来的XML,像如下:
<X>
<a>dir</a>
<b>file</f>
因此,所有的文件(有每个数据对象的string[]
数组),嵌套下面的目录域。
这很容易吗?还是有一个外部库可以很容易地为我做这件事?
感谢
使用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工作时,但这一切都非常好,小道和其他记录。
你的意思是这样的:
var myxml = new XElement(yourObj.FolderName);
myxml.Add(new XElement("Files",yourObj.Files.Select(x => new XElement("File",x)));
我实际上使用过xmlserializer,但遇到了不允许的字符等问题。似乎像YMMV。我没有Xml的专业知识,需要保留这些字符。这似乎工作。 – dotnetdev 2011-03-27 21:19:50
@dotnetdev:禁止xmlserializer中的错误,只要所有组成字段/属性都是可序列化的,您的里程应该**不会变化。 XML标准允许在所有内容中表示所有字符,并且框架知道如何。我假设你指向读取另一端(而不是.NET)的XML的问题?在这种情况下:使用真正的XML解析器或阅读关于XML字符编码和实体引用的一些文档。 – sehe 2011-03-27 21:29:57