C# 模式验证XML
我有一个XSD文件和一个XML文件,如何检查XML是否与XSD文件一样位于正确的模式中 我知道C# 模式验证XML,c#,xml,xsd,schema,C#,Xml,Xsd,Schema,我有一个XSD文件和一个XML文件,如何检查XML是否与XSD文件一样位于正确的模式中 我知道XmlDocument类中有一个validate函数,但它需要一个事件处理程序 我所需要的是真是假 另外,我正在使用Invisial Studio 2010。您可以使用XmlReaderSettings类和create方法创建一个正在验证的XmlReader实例 private bool ValidateXml(string xmlFilePath, string schemaFilePath, st
XmlDocument
类中有一个validate函数,但它需要一个事件处理程序
我所需要的是真是假
另外,我正在使用Invisial Studio 2010。您可以使用XmlReaderSettings类和create方法创建一个正在验证的XmlReader实例
private bool ValidateXml(string xmlFilePath, string schemaFilePath, string schemaNamespace, Type rootType)
{
XmlSerializer serializer = new XmlSerializer(rootType);
using (var fs = new StreamReader(xmlFilePath, Encoding.GetEncoding("iso-8859-1")))
{
object deserializedObject;
var xmlReaderSettings = new XmlReaderSettings();
if (File.Exists(schemaFilePath))
{
//select schema for validation
xmlReaderSettings.Schemas.Add(schemaNamespace, schemaPath);
xmlReaderSettings.ValidationType = ValidationType.Schema;
try
{
using (var xmlReader = XmlReader.Create(fs, xmlReaderSettings))
{
if (serializer.CanDeserialize(xmlReader))
{
return true;
//deserializedObject = serializer.Deserialize(xmlReader);
}
else
{
return false;
}
}
}
catch(Exception ex)
{ return false; }
}
}
}
如果模式无效或无法反序列化xml,上述代码将引发异常。rootType是等效类层次结构中根元素的类型
例如: 架构位于:。将文件另存为
D:\SampleSchema.xsd
。
运行
xsd.exe
:
xsd.exe/c/out:D:\“D:\SampleSchema.xsd”
/out
选项用于指定输出目录,/c
用于指定生成类的工具D:\SampleSchema.cs
将该类添加到visual studio项目中。
对于上面的xsd示例,根类是
note
。
调用该方法
bool isXmlValid = ValidateXml(@"D:\Sample.xml",
@"D:\SampleSchema.xsd",
@"http://www.w3.org/2001/XMLSchema",
typeof(note));
更多信息:
- 你可以这样做
public class XmlValidator
{
private bool _isValid = true;
public bool Validate(string xml)
{
_isValid = true;
// Set the validation settings as needed.
var settings = new XmlReaderSettings { ValidationType = ValidationType.Schema };
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += ValidationCallBack;
var reader = XmlReader.Create(new StringReader(xml), settings);
while(reader.Read())
{
// process the content if needed
}
return _isValid;
}
private void ValidationCallBack(object sender, ValidationEventArgs e)
{
// check for severity as needed
if(e.Severity == XmlSeverityType.Error)
{
_isValid = false;
}
}
}
class Program
{
static void Main(string[] args)
{
var validator = new XmlValidator();
var result =
validator.Validate(@"<?xml version=""1.0""?>
<Product ProductID=""1"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:noNamespaceSchemaLocation=""schema.xsd"">
<ProductName>Chairs</ProductName>
</Product>");
}
公共类XmlValidator
{
private bool_isValid=true;
公共bool验证(字符串xml)
{
_isValid=true;
//根据需要设置验证设置。
var settings=newxmlreadersettings{ValidationType=ValidationType.Schema};
settings.ValidationFlags |=XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationFlags |=XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationFlags |=XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler+=ValidationCallBack;
var reader=XmlReader.Create(新的StringReader(xml),设置);
while(reader.Read())
{
//如果需要,处理内容
}
返回有效;
}
私有void ValidationCallBack(对象发送方,ValidationEventArgs e)
{
//根据需要检查严重性
if(e.Severity==XmlSeverityType.Error)
{
_isValid=false;
}
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var validator=新的XmlValidator();
var结果=
validator.Validate(@)
椅子
");
}
模式
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Product">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ProductName" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="ProductID" use="required" type="xsd:int"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
有一种非常简单的方法:
private void ValidationCallBack(object sender, ValidationEventArgs e)
{
throw new Exception();
}
public bool validate(string sxml)
{
try
{
XmlDocument xmld=new XmlDocument ();
xmld.LoadXml(sxml);
xmld.Schemas.Add(null,@"c:\the file location");
xmld.validate(ValidationCallBack);
return true;
}
catch
{
return false;
}
}
注:我没有在VS中写这篇文章,所以可能会有不区分大小写的单词,但这些代码是有效的!如果不在函数调用中输入所有xml,我怎么做?while循环应该做什么?函数如何使用该方案?您可以传递一个路径到Validate函数并执行'var reader=XmlReader.Create(路径,设置);“而不是”var reader=XmlReader.Create(new StringReader(xml),settings);“好的。但是“while”是什么呢?”循环应该做什么?函数如何使用该方案?while循环解析xml文档,并在这个过程中验证xml。xml包含对架构的引用:a.while循环中需要编写什么代码?b.如果代码中没有对架构的引用,那么它就在属性中。它可以工作吗?这不会由于未设置ValidationFlags,因此无法验证任何内容。这只会反序列化xml。我应该输入什么作为rootType?rootType是从xsd文件创建的类模型的根元素的类型。例如,如果创建类模型(使用.NET的xsd.exe工具),则类型将为“Product”(对于@Steven给出的示例xsd)。使用.NET的xsd工具创建一个类层次结构。例如,如果架构文件位于“D:\testSchema.xsd”,则工具用法应为>xsd/c/out:D:\“D:\testSchema.xsd”。这是一个命令行工具。有关更多信息:啊?与类型的连接是什么?我应该如何编写类型?谢谢,这正是我所需要的!与其他解决方案相比,非常简单,谢谢!
private void ValidationCallBack(object sender, ValidationEventArgs e)
{
throw new Exception();
}
public bool validate(string sxml)
{
try
{
XmlDocument xmld=new XmlDocument ();
xmld.LoadXml(sxml);
xmld.Schemas.Add(null,@"c:\the file location");
xmld.validate(ValidationCallBack);
return true;
}
catch
{
return false;
}
}