2014-01-14 6 views
1

Я пытаюсь проверить файл XML и показать любые ошибки пользователю.Проверка XML и отображение неудачных

Упрощенный пример:

XML:

<MyApps> 
    <MyApp> 
    <Header> 
     <Name>Name 1</Name> 
     <Rate>4</Rate> 
    </Header> 
    <Players> 
     <Player> 
     <Name>Bert</Name> 
     <Age>22</Age> 
     </Player> 
     <Player> 
     <Name>Harry</Name> 
     <Age>12</Age> 
     </Player> 
     <Player> 
     <Name>George</Name> 
     <Age>16</Age> 
     </Player>  
    </Players> 
    </MyApp> 
    <MyApp> 
    <Header> 
     <Name>Name 2</Name> 
     <Rate>3</Rate> 
    </Header> 
    <Players> 
     <Player> 
     <Name>Fred</Name> 
     <Age>29</Age> 
     </Player> 
     <Player> 
     <Name>Bill</Name> 
     <Age>19</Age> 
     </Player> 
     <Player> 
     <Name>Garry</Name> 
     <Age>20</Age> 
     </Player>  
    </Players> 
    </MyApp> 
</MyApps> 

Validator:

public class XMLValidationMessage 
{ 
    public int LineNumber; 
    public int LinePosition; 
    public string Message; 
    public XmlSeverityType Severity; 
} 
public class XMLValidationResponse 
{ 

    /// <summary> 
    /// Result of the XML Validation. 
    /// </summary> 
    [Description("Result of the XML Validation")] 
    public bool IsXMLValid { get; set; } 

    /// <summary> 
    /// XML Validation Errors. 
    /// </summary> 
    [Description("XML Validation Errors")] 
    public List<XMLValidationMessage> ValidationErrors { get; set; } 


    public XMLValidationResponse() 
    { 
     ValidationErrors = new List<XMLValidationMessage>(); 
    } 
} 


    private static XMLValidationResponse response = new XMLValidationResponse(); 

    public static XMLValidationResponse ValidateXML(string XMLFile, string XSDFile) 
    { 
     XmlSchemaSet schemaSet = new XmlSchemaSet(); 
     schemaSet.Add(null, XSDFile); 
     response.IsXMLValid = true; 
     Validate(XMLFile, schemaSet); 
     return response; 
    } 
    private static void Validate(String filename, XmlSchemaSet schemaSet) 
    { 

     XmlSchema compiledSchema = null; 

     foreach (XmlSchema schema in schemaSet.Schemas()) 
     { 
      compiledSchema = schema; 
     } 

     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.Schemas.Add(compiledSchema); 
     settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack); 
     settings.ValidationType = ValidationType.Schema; 

     //Create the schema validating reader. 
     XmlReader vreader = XmlReader.Create(filename, settings); 

     while (vreader.Read()) { } 

     //Close the reader. 
     vreader.Close(); 
    } 

    private static void ValidationCallBack(object sender, ValidationEventArgs args) 
    { 
     response.IsXMLValid = false; 
     if (args.Severity == XmlSeverityType.Warning) 
     { 
      XMLValidationMessage xmlm = new XMLValidationMessage(); 
      xmlm.Severity = XmlSeverityType.Warning; 
      xmlm.LineNumber = 0; 
      xmlm.LinePosition = 0; 
      xmlm.Message = "Matching schema not found. No validation occurred."; 
      response.ValidationErrors.Add(xmlm); 
     } 
     else 
     { 
      XMLValidationMessage xmlm = new XMLValidationMessage(); 
      xmlm.Severity = XmlSeverityType.Error; 
      xmlm.LineNumber = args.Exception.LineNumber; 
      xmlm.LinePosition = args.Exception.LinePosition; 
      xmlm.Message = args.Message; 
      response.ValidationErrors.Add(xmlm); 
     } 

    } 

Если XML не проходит проверку, я получаю список ошибок в виде XMLValidationMessage. Это дает мне номер строки, позицию линии и сообщение. Однако, похоже, нет способа связать ошибку с элементом XML, вызвавшим ошибку. После проверки я десериализую XML в объект класса данных, затем использую его для заполнения древовидного представления. В конечном итоге то, что я хочу сделать, это выделить ветви дерева, которые не прошли проверку. Я думаю, что, возможно, я собираюсь сделать это неправильно?

Update - Пример ошибки

ValidationErrors Count = 14 System.Collections.Generic.List<MyApp.Xml.XMLValidationMessage> 
- [0] {MyApp.Xml.XMLValidationMessage} MyApp.Xml.XMLValidationMessage 
    LineNumber 89 int 
    LinePosition 127 int 
    Message "The 'http://www.myweb.co.uk/srm/mscc:Remarks' element is invalid - The value 'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...' is invalid according to its datatype 'http://www.MyWeb.co.uk/srm/mscc:String50Type' - The actual length is greater than the MaxLength value." string 
    Severity Error System.Xml.Schema.XmlSeverityType 

я получить коллекцию ошибок, которые все действительные ошибки. Не уверен, что схема поможет этой части работать нормально. Проблема, с которой я столкнулся, - это связать ошибку с элементом XML, вызывающим ошибку.

+0

Не могли бы вы привести пример ошибок, которые вы получили? Схема также будет полезна. –

ответ

1

Эти данные можно найти в аргументе отправителя в вашем ValidationCallbackMethod. Я добавил пару строк в оператор else из примера ValidationCallbackMethod, который вы опубликовали.

private static void ValidationCallBack(object sender, ValidationEventArgs args) 
{ 
    response.IsXMLValid = false; 
    if (args.Severity == XmlSeverityType.Warning) 
    { 
     XMLValidationMessage xmlm = new XMLValidationMessage(); 
     xmlm.Severity = XmlSeverityType.Warning; 
     xmlm.LineNumber = 0; 
     xmlm.LinePosition = 0; 
     xmlm.Message = "Matching schema not found. No validation occurred."; 
     response.ValidationErrors.Add(xmlm); 
    } 
    else 
    { 
     // this will give you the name of the schema element that failed validation 
     var schemaInfo = ((XmlReader)sender).SchemaInfo; 
     var elementThatFailedValidation = schemaInfo.SchemaElement.Name; 

     XMLValidationMessage xmlm = new XMLValidationMessage(); 
     xmlm.Severity = XmlSeverityType.Error; 
     xmlm.LineNumber = args.Exception.LineNumber; 
     xmlm.LinePosition = args.Exception.LinePosition; 
     xmlm.Message = args.Message; 
     response.ValidationErrors.Add(xmlm); 
    } 

} 
Смежные вопросы