Я пытаюсь сделать это: у Меня есть XML-файл, который я хочу проверить согласно файлу XSD. До сих пор так бог... То, что я должен сделать, присутствует весь узел, где ошибка проверки.
Например, у меня есть этот XML-файл:
<people>
<name>Jonh</name>
<tel>91991919199191919</tel>
</people>
Когда я проверю этот файл, это получит ошибку в узле телефона. И я хочу представить имя к заключительному пользователю моего приложения и что не так в XML для этого.
Я - triyng, чтобы сделать это в C#.NET.
Спасибо за справку...
Можно ли использовать .NET 3.5? Если да, то вы можете использовать метод расширения Validate
на XDocument
и предоставить ValidationEventHandler
. Если проверка не прошла успешно, ваш обработчик будет вызван с помощью ValidationEventArgs
, который вы можете использовать для поиска места ошибки.
Ошибки проверки обычно выдаются как XmlSchemaException - вы можете перехватить их и использовать свойство Message, чтобы сообщить об этом пользователю.
.Взгляни на Шематрон. Он отлично подходит для валидации такого рода. В то время как вы CAN проверяете, используя Schema, Schematron просто использует XSL и в результате получается XML документ, содержащий сообщения о проверке, которые вы можете сделать удобными для пользователя
.Этот код проверяет XML файл на соответствие XSD файлу и возвращает ошибку с номером строки.
public static void ValidateXML(Stream stream)
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("", "yourXSDPath");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create(stream, settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
document.Validate(eventHandler);
reader.Close();
}
static void ValidationEventHandler(object sender, ValidationEventArgs e)
{}
try
{
ValidateXML(yourXMLStream);
}
catch (XmlSchemaValidationException ex)
{
Console.WriteLine(String.Format("Line {0}, position {1}: {2}", ex.Message, ex.LineNumber, ex.LinePosition));
}