如何通过.NETvalidationxml代码文件? +如果我使用XML序列化,我该怎么做?

我希望用户能够将数据导出为XML文件。 当然,我希望他们以后能够导入相同的XML文件,但是他们总是可以更改它,或者它可能是不同的XML文件。

所以我想validationXML文件以检查它是否采用我期望的格式。 所以我想我需要像模式一样来检查它必须通过代码。

所以,如果我期待

      

我不希望其他格式在文件中,而不是我期望的格式。

另外我如何validation字段? 就像说我要求标签之间必须有一些文字。 如果为空,则文件无效。

那怎么能这样呢?

编辑

我决定使用XML序列化,所以我知道如果格式错误并且忽略不起作用的东西,它将通过exception。 但是我不确定我是否应该通过它和C#来validation每个记录,或者我应该尝试制作一个xml架构来完成它。

如果我想通过xml序列化的xml架构来实现它将如何工作? 就像我首先做的事情,就像我在回复中看到的那样然后去序列化它? 或者我该怎么做?

这是您可以用来执行此操作的代码段:

 using (FileStream stream = File.OpenRead(xsdFilepath)) { XmlReaderSettings settings = new XmlReaderSettings(); XmlSchema schema = XmlSchema.Read(stream, OnXsdSyntaxError); settings.ValidationType = ValidationType.Schema; settings.Schemas.Add(schema); settings.ValidationEventHandler += OnXmlSyntaxError; using (XmlReader validator = XmlReader.Create(xmlPath, settings)) { // Validate the entire xml file while (validator.Read()) ; } } 

发生语法错误时将调用OnXmlSyntaxError函数。

有几种方法可以validationXML文件。 查看如何在Visual C#.NET中使用DTD,XDR或XSDvalidationXML文档

另请参阅在C#示例中针对引用的XSDvalidationXML

另一个很好的例子是在C#中运行时使用代码validationXML对XSD

这是上一篇文章的代码:

 public void ValidateXmlDocument( XmlReader documentToValidate, string schemaPath) { XmlSchema schema; using (var schemaReader = XmlReader.Create(schemaPath)) { schema = XmlSchema.Read(schemaReader, ValidationEventHandler); } var schemas = new XmlSchemaSet(); schemas.Add(schema); var settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.Schemas = schemas; settings.ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ReportValidationWarnings; settings.ValidationEventHandler += ValidationEventHandler; using (var validationReader = XmlReader.Create(documentToValidate, settings)) { while (validationReader.Read()) { } } } private static void ValidationEventHandler( object sender, ValidationEventArgs args) { if (args.Severity == XmlSeverityType.Error) { throw args.Exception; } Debug.WriteLine(args.Message); } 

您可以使用LINQ to XML: http : //msdn.microsoft.com/en-us/library/bb387037.aspx 。 此页面还显示了如何与源一起转储任何无效节点: http : //blogs.msdn.com/xmlteam/archive/2007/03/03/the-new-linq-to-xml-bridge-classes -to-系统xml.aspx

使用.NET中的SchemavalidationXML文件

您可以在类中使用xml序列化:

 [XmlType("Root", Namespace = "http://example.com/Root")] [XmlRoot(Namespace = "http://example.com/Root.xsd", ElementName = "Root", IsNullable = false)] public class Root { [XmlElement("Something")] public Something Something { get; set; } } public class Something { [XmlElement("SomethingElse")] public SomethingElse SomethingElse { get; set; } } public class SomethingElse { [XmlText] public string Text { get; set; } } 

像这样序列化:

 var serializer = new XmlSerializer(typeof(Root)); serializer.Serialize(outputStrem, myRoot); 

然后,您可以在反序列化之前进行测试,例如:

 var serializer = new XmlSerializer(typeof(Root)); string xml = @"   Yep!  "; // remember to use the XML namespace! Debug.Assert(serializer.CanDeserialize(new XmlTextReader(new StringReader(xml)))); 

然后简单地反序列化:

 Root newRoot = (Root)serializer.Deserialize(inputStream); 

你的XSD是隐含的。 它符合你的课程。 要使用更丰富的XSD,您可以冒险进入Schema Providers 。