如果theire是xml中未在xsd中定义的属性或元素,我如何获得ValidationEvents。
XSD:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema id="VoiceXmlTSPro"
targetNamespace="http://tempuri.org/VoiceXmlTSPro.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/VoiceXmlTSPro.xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Elements-->
<xsd:element name="vxml">
<xsd:complexType>
<xsd:attribute ref="base"/>
<xsd:attribute ref="lang"/>
</xsd:complexType>
</xsd:element>
<!-- End Elements-->
<!-- Attributes-->
<xsd:attribute name="base" type="xsd:anyURI">
</xsd:attribute>
<xsd:attribute name="lang" type="xsd:string">
</xsd:attribute>
<!-- End Attributes-->
</xsd:schema>
XML:
<?xml version="1.0" encoding="utf-8" ?>
<vxml application="notsupported" lang="en-US" base="http://www.zebra.com">
<unknow></unknow>
</vxml>
我想要一个关于application属性和unknow ellement的警告。 但是这段代码不是任何事件。
public override void Validate(string source)
{
ValidationResults.Clear();
XmlSchemaFactory xmlSchemaFactory = new XmlSchemaFactory();
XmlReaderSettings vxmlTestSettings = new XmlReaderSettings();
vxmlTestSettings.ValidationType = ValidationType.Schema;
vxmlTestSettings.ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints| XmlSchemaValidationFlags.ReportValidationWarnings ;
try
{
XmlSchema xsdSchema = xmlSchemaFactory.Create(Resource.VoiceXmlTSPro);
if (xmlSchemaFactory.HasErrors())
{
// if the schema is invalid the read wil not read
return;
}
vxmlTestSettings.Schemas.Add(xsdSchema);
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationHandler);
using (MemoryStream stream = new MemoryStream(Encoding.ASCII.GetBytes(source)))
using (XmlReader xmlReader = XmlReader.Create(stream, vxmlTestSettings))
{
XmlDocument document = new XmlDocument();
document.Load(xmlReader);
document.Validate(eventHandler);
}
}
catch (Exception ex)
{
...
}
}
答案 0 :(得分:0)
如果你需要做的就是针对模式验证XML标记字符串然后使用XmlReader
解析带有StringReader
XmlReaderSettings
XmlDocument
的字符串应该这样做,那么就没有需要使用Validate
及其 static void Main(string[] args)
{
string[] xmls = { @"<vxml application=""notsupported"" lang=""en-US"" base=""http://www.zebra.com"">
<unknow></unknow>
</vxml>",
@"<vxml application=""notsupported"" lang=""en-US"" base=""http://www.zebra.com"" xmlns=""http://example.com/ns1"">
<unknow></unknow>
</vxml>"
};
foreach (string xml in xmls)
{
Console.WriteLine("Validating");
Validate(xml, "../../schema1.xml");
Console.WriteLine();
}
}
static void Validate(string xmlMarkup, string schemaUri)
{
XmlReaderSettings xrs = new XmlReaderSettings();
xrs.Schemas.Add(null, schemaUri);
xrs.ValidationType = ValidationType.Schema;
xrs.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
xrs.ValidationEventHandler += (obj, valArgs) =>
{
Console.WriteLine("{0}: {1}", valArgs.Severity, valArgs.Message);
};
using (StringReader sr = new StringReader(xmlMarkup))
{
using (XmlReader xr = XmlReader.Create(sr, xrs))
{
while (xr.Read()) { }
}
}
}
方法。
这是一个例子,对于第一个示例,它只输出警告,因为输入文档没有名称空间声明,因为第二个文档有关于未声明的元素和属性的错误:
<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema id="VoiceXmlTSPro"
targetNamespace="http://example.com/ns1"
elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Elements-->
<xsd:element name="vxml">
<xsd:complexType>
<xsd:attribute name="base" type="xsd:anyURI"/>
<xsd:attribute name="lang" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<!-- End Elements-->
</xsd:schema>
架构是
Validating
Warning: Could not find schema information for the element 'vxml'.
Warning: Could not find schema information for the attribute 'application'.
Warning: Could not find schema information for the attribute 'lang'.
Warning: Could not find schema information for the attribute 'base'.
Warning: Could not find schema information for the element 'unknow'.
Validating
Error: The 'application' attribute is not declared.
Error: The element cannot contain white space. Content model is empty.
Error: The element 'http://example.com/ns1:vxml' cannot contain child element 'http://example.com/ns1:unknow' because the parent element's content model is empty.
输出
{{1}}