我有一个XML,我想加载到对象,操纵这些对象(设置值,读取值),然后保存这些XML。 对我来说,在我创建的结构(xsd)中使用XML非常重要。
这样做的一种方法是编写我自己的序列化程序,但它是否内置支持它或C#中的开源我可以使用?
答案 0 :(得分:28)
您可以使用xsd.exe从模式(xsd)生成可序列化的C#类:
xsd.exe dependency1.xsd dependency2.xsd schema.xsd /out:outputDir
如果架构具有依赖关系(包含/导入的架构),则它们必须全部包含在同一命令行中。
答案 1 :(得分:18)
此代码(C#DotNet 1.0以后)可以很好地将大多数对象序列化为XML。 (然后回来) 它不适用于包含ArrayLists的对象,如果可能,只能使用Arrays
using System;
using System.IO;
using System.Text;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public static string Serialize(object objectToSerialize)
{
MemoryStream mem = new MemoryStream();
XmlSerializer ser = new XmlSerializer(objectToSerialize.GetType());
ser.Serialize(mem, objectToSerialize);
ASCIIEncoding ascii = new ASCIIEncoding();
return ascii.GetString(mem.ToArray());
}
public static object Deserialize(Type typeToDeserialize, string xmlString)
{
byte[] bytes = Encoding.UTF8.GetBytes(xmlString);
MemoryStream mem = new MemoryStream(bytes);
XmlSerializer ser = new XmlSerializer(typeToDeserialize);
return ser.Deserialize(mem);
}
答案 2 :(得分:7)
LINQ to XML非常强大,如果您使用.net 3.5,LINQ to XSD也可能对您有用!
答案 3 :(得分:2)
使用visual studio附带的xsd.exe命令行程序创建可在项目/解决方案中使用的类文件,并使用System.Xml.Serialization命名空间(特别是XmlSerializer类)来序列化/反序列化这些类往返于磁盘。
答案 4 :(得分:2)
使用System.Xml.Serialization; 如果要将xml映射到任何随机对象,则此命名空间具有您需要的所有属性。或者,您可以使用xsd.exe工具
xsd file.xsd {/ classes | / dataset} [/ element:element] [/ language:language] [/ namespace:namespace] [/ outputdir:directory] [URI:uri] 这将获取您的xsd文件并从中创建c#或vb.net类。
http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx
答案 5 :(得分:1)
答案 6 :(得分:1)
我们已经创建了一个框架,可以从XML中自动生成C#类。它是一个可视项目模板,您可以将XML传递给它,并且这些类在项目中自动生成。使用这些类,您可以创建/读取/写入XML。
检查框架和Visual C#项目模板的此链接:click here
答案 7 :(得分:1)
我同意xsd确实很糟糕......但他们制作的另一个版本几乎没有人知道。它叫做xsd对象生成器。它的下一个版本,并有更多的选择。它从XSD生成文件,效果很棒。如果你有一个类似XML spy的模式生成器;从您的xml创建一个xsd并使用此工具。我使用这个工具创建了非常复杂的类。 然后为额外的属性\方法等创建部分类,然后当您更新模式时,您只需重新生成类,并且任何编辑都会在您的部分类中保留。
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=7075
答案 8 :(得分:0)
我敢打赌NetDataContractSerializer可以做你想做的事。