我想要做的是针对 XSD 验证 XML。这一切都非常简单,但是我遇到了没有命名空间的 XML 的问题。C# 仅在命名空间与 XSD 的目标命名空间匹配时才验证 xml。这似乎是正确的,但是没有命名空间的 XML 或与 SchemaSet 不同的 XML 应该给出异常。是否有实现此目的的属性或设置?还是我必须通过读取 xml 的 xmlns 属性来手动获取命名空间?
清除示例:
代码:
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://example.com", @"test.xsd");
settings.Schemas.Add("http://example.com/v2", @"test2.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader r = XmlReader.Create(@"test.xml", settings);
XmlReader r = XmlReader.Create(new StringReader(xml), settings);
XmlDocument doc = new XmlDocument();
try
{
doc.Load(r);
}
catch (XmlSchemaValidationException ex)
{
Console.WriteLine(ex.Message);
}
XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.com" targetNamespace="http://example.com" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="test">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]+\.+[0-9]+" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
有效的 XML:
<test xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</test>
无效的 XML,这将无法验证:
<hello xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</hello>
错误:The 'http://example.com:hello' element is not declared
。
无效的 XML,但会验证,因为命名空间不存在:
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">112.1</hello>
我怎样才能解决这个问题?
非常感谢任何帮助。