为什么XmlDocument Validate不会在具有不同命名空间的xml上抛出任何异常?

时间:2011-03-04 14:05:35

标签: .net xml xsd

我根据我的XSD架构验证了一些外部XML文档:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"       
           version="2011-03-01">
    <xs:element name="Document" type="DocumentType" />
    <xs:complexType name="DocumentType">
        <xs:sequence>
            <xs:element name="Author" type="string" minOccurs="0" />
            <xs:element maxOccurs="unbounded" name="Receiver" type="string" />
        </xs:sequence>
    </xs:complexType>

我的架构不使用命名空间。 它运行良好,但我对某些XML有问题。 它是excel文件保存为XLM 。它完全无效,但我的验证器没有抱怨。 它根据我的架构无效,但我的方法不会抛出任何异常!它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<office:document-content
    xmlns:office="foo">
    <office:bar></office:bar>
</office:document-content>

这是我的代码:

public void Validate(Stream streamWithXML)
{
XmlReaderSettings settings = new XmlReaderSettings();

settings.Schemas.Add(settings.Schemas.Add("", xsdPath));
settings.ValidationType = ValidationType.Schema;

XmlReader reader = XmlReader.Create(streamWithXML, settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
document.Validate(eventHandler);
reader.Close();
}

static void ValidationEventHandler(object sender, ValidationEventArgs e)
{}

你有什么线索吗?我想这是因为该特定文档具有一些内联命名空间声明。但是http://tools.decisionsoft.com/schemaValidate/的在线验证器会抛出异常:

  

找不到元素的声明   的办公室:文档内容'。

这是正确的。有没有办法让.NET验证器在这种情况下抛出异常?

2 个答案:

答案 0 :(得分:2)

它不会抛出异常,因为它不是为了设计的。

文档显示预期的用法是创建验证事件处理程序并将其传递给Validate方法。

http://msdn.microsoft.com/en-us/library/ms162371.aspx

如果文档无法验证,此事件处理程序包含警告和错误,并且您需要检查此事件并在您定义的事件处理程序中相应地处理验证错误。

事件处理程序中的ValidationEventArgs包含异常,严重性和消息:

http://msdn.microsoft.com/en-us/library/system.xml.schema.validationeventargs.aspx

第一个链接中的代码示例显示了poper的用法。

答案 1 :(得分:0)

您需要在设置对象中设置ValidationFlags以包含ReportValidationWarnings