xsd与xml和类(class)对象之间的互相转换
第一:通过现有的已经写好的xsd来生成class(.cs)文件。
在您Visual Studio的安装目录下的SDKv2.0Bin中有个应用程序xsd.exe(通过这个应用程序可以使用xsd来创建类文件)。
具体操作:通过打开Visual Studio 命令提示,可以输入xsd指令来查看一些具体的操作指令的用处,然后通过输入指令xsd /c 你xsd文件所在的绝对的物理路径,输入完成后回车。这样,类文件就创建成功了(文件的路径为Visual Studio的安装目录下的VC目录下面。)。
注意:xsd文件中各属性和元素的数据类型必须为C#中现有的数据类型。
第二:利用上一步生成的类文件(.cs)来创建类的实例以及赋值,然后将这些数据创建和写入xml文件中。
将已经创建好的类的实例(XMLObject)和要创建的XML文件的路径,然后将参数赋给下面的CreateXMLFile方法。这样XML文件和数据就会被写入了。
///
/// Create and Write Xml Document
///
/// XML Class Object
/// Create XML File Url
public void CreateXMLFile(object XMLObject, string XMLDocumentUrl)
{
try
{
using(TextWriter textWriter = new StreamWriter(XMLDocumentUrl))
{
XmlSerializer xmlSerializer = new XmlSerializer(XMLObject.GetType());
xmlSerializer.Serialize(textWriter, XMLObject);
//textWriter.Close();
}
}
catch
{
}
}
第三:将上一步写好的xml文件中的数据读出来赋值给类(class)的声明。
调用下面方法的代码:(如果你的类的名称为XMLClass)
XMLClass XmlObject;
XmlObject=(XMLClass)ReadXMLFile(XmlObject,xml文件的路径);
这样,就生成了类的实例,你就可以直接从这个XmlObject对象中来获取XML文件中的数据了。
///
/// Read XML File
///
/// Class Type
/// XML File Url
/// XML Object
public object ReadXMLFile(object type,string XMLDocumentUrl)
{
//object XmlObject;
try
{
//new filestream to open serialized object
using(FileStream fileStream = new FileStream(XMLDocumentUrl, FileMode.Open))
{
//new serializer
XmlSerializer xmlSerializer = new XmlSerializer(type.GetType());
//deserialize the object
type = xmlSerializer.Deserialize(fileStream);
//load it in the list box.
//fileStream.Close();
}
return type;
}
catch
{
}
return null;
}
第四:使用XSD来验证XML的合法性:
public class XMLValidator
{
public XMLValidator(string XSDDocumentUrl, string[] XMLDocumentUrl)
{
XSDDocument = XSDDocumentUrl;
XMLDocuments = XMLDocumentUrl;
}
private string[] XMLDocuments;
private string XSDDocument;
private XmlValidatingReader myXmlValidatingReader = null;
private XmlTextReader myXmlTextReader = null;
private Boolean Success = true;
public void Run(string TargetNameSpace)
{
try
{
XmlSchemaCollection myXmlSchemaCollection = new XmlSchemaCollection();
myXmlSchemaCollection.Add(TargetNameSpace, new XmlTextReader(XSDDocument));
if (XMLDocuments.Length > 0)
{
//Validator XML File
Success = true;
string xsddoxument = XSDDocument.Contains("/") ? XSDDocument.Split('/')[XSDDocument.Split('/').Length - 1] : XSDDocument.Split('/')[XSDDocument.Split('/').Length - 1];
foreach (string xmldocumenturl in XMLDocuments)
{
string xmldoxument = xmldocumenturl.Contains("/") ? xmldocumenturl.Split('/')[xmldocumenturl.Split('/').Length - 1] : xmldocumenturl.Split('/')[xmldocumenturl.Split('/').Length - 1];
Console.WriteLine();
Console.WriteLine("Useing XSD File:" + xsddoxument + " Validator XML File: " + xmldoxument + " ");
myXmlTextReader = new XmlTextReader(xmldocumenturl);
myXmlValidatingReader = new XmlValidatingReader(myXmlTextReader);
myXmlValidatingReader.Schemas.Add(myXmlSchemaCollection);
myXmlValidatingReader.ValidationType = ValidationType.Schema;
Validate();
}
}
}
catch (Exception e)
{
Console.WriteLine("Exception:" + e.ToString());
}
finally
{
//XmlTextReader
if (myXmlValidatingReader != null)
myXmlValidatingReader.Close();
}
}
private void Validate()
{
try
{
//The incident set certification procedures
myXmlValidatingReader.ValidationEventHandler += new ValidationEventHandler(this.ValidationEventHandle);
//Read XML Data
while (myXmlValidatingReader.Read()) { }
Console.WriteLine("Validator Completed: Validator {0} ", (Success == true ? "Success" : "Fiald"));
}
catch (XmlException e)
{
Console.WriteLine("Xml Exception:" + e.ToString() + " ");
}
catch (Exception e)
{
Console.WriteLine("Exception:" + e.ToString() + " ");
}
}
public void ValidationEventHandle(object sender, ValidationEventArgs args)
{
Success = false;
Console.WriteLine(" Validator Error:" + args.Message + " ");
if (args.Severity == XmlSeverityType.Warning)
{
Console.WriteLine("Did not find it mandatory certification framework. ");
}
else
if (args.Severity == XmlSeverityType.Error)
{
Console.WriteLine("Examples of document verification, validation error occurred. ");
}
if (args.Exception != null) //XSD Structure validation error
{
Console.WriteLine(args.Exception.SourceUri + "," + args.Exception.LinePosition + "," + args.Exception.LineNumber);
}
}
}
http://www.cnblogs.com/xiaojiangjiang/archive/2008/01/13/886466.html
第五:也可以通过现有的Class来生成XSD.和XML
具体步骤:打开Visual Studio 命令提示,输入csc /t:library 类(.cs)文件的绝对路径 ,回车。xsd文件创建的路径:文件的路径为Visual Studio的安装目录下的VC目录下面,文件的名称一般是schema加上一个随机的序列号,你可以改文件的名称。
注意:这个class必须包含一个空的构造函数,类还要有一些特性(可以从上面的第一步中生成class进行模仿)。
这样就实现了这三者之间的转换了。