2015-12-21 91 views
0

如何獲取ValidationEvents如果theire是xml中未定義在xsd中的屬性或元素。XmlDocument.Validate不支持的屬性或元素

的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> 

我要爲應用性質和對不明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

那麼,什麼是你的目標恰好,試圖使用XML實例文檔驗證字符串是否符合.NET框架中設置的特定模式或模式?或者使用'Validate'方法?如果模式具有'targetNamespace =「http://tempuri.org/VoiceXmlTSPro.xsd」',爲什麼你的實例不聲明那個名字空間?使用您當前的實例文檔,您只會收到有關根元素沒有模式的警告。 –

回答

0

如果你需要做的就是驗證XML標記的字符串中的一個模式,然後解析與XmlReader串在適當​​應該做一個StringReader,就沒有必要使用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. 
相關問題