Я пытаюсь проверить файл 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, вызывающим ошибку.
Не могли бы вы привести пример ошибок, которые вы получили? Схема также будет полезна. –