我想知道是否有XmlDocument.Validate
的替代品来针对XSD进行验证。
原因是所提供的有关异常(验证错误)的信息可能会更加详细。
例如,可能存在经过验证的元素的索引或路径,行号和位置,使用XmlDocument.Validate
时为零。
答案 0 :(得分:0)
已解析的文档不会保留任何源文本信息,就像已编译的程序不会保留任何源代码信息一样。为了获得该信息,必须在加载文档时对其进行验证。给定以下架构和xml字符串,从validation documentation复制:
string xsdMarkup =
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<xsd:element name='Root'>
<xsd:complexType>
<xsd:sequence>
<xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>
<xsd:element name='Child2' minOccurs='1' maxOccurs='1'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));
var xml=@"<Root>
<Child1>content1</Child1>
<Child3>content1</Child3>
</Root>";
以下代码:
void ValidationHandler(object o,ValidationEventArgs e)
{
Console.WriteLine("{0}:{1} {2}", e.Exception.LineNumber,e.Exception.LinePosition,e.Message);
}
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas=schemas;
settings.ValidationEventHandler += ValidationHandler;
settings.ValidationFlags = settings.ValidationFlags |
XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create(new StringReader(xml), settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
将打印:
3:8元素'Root'具有无效的子元素'Child3'。可能的元素列表:“ Child2”。
相同的代码也可以与XDocument一起使用:
var doc=XDocument.Load(reader);
将打印相同的错误。