Проверка Xml с использованием схемы XSD

Следующий код помогает мне проверить XML-файл с помощью схемы XSD.

XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.Add(null, xsdFilePath); settings.ValidationType = ValidationType.Schema; settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler); XmlDocument document = new XmlDocument(); document.Load(xmlFilePath); XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings); while (rdr.Read()) { } isValid = true; 

ValidationEventHandler также сообщает мне, что такое ошибки, но не говорит мне о «где» или «на какой строке» они находятся. Есть ли способ получить номер строки, где XML не может быть проверен?

Разве это не сделает то, что вам нужно?

Создайте объект XmlReaderSettings и включите предупреждения через этот объект.

К сожалению, кажется, нет способа передать свой собственный объект XmlReaderSettings в XmlDocument.Validate() .
Вместо этого вы можете использовать проверенный XmlReader и XmlNodeReader для проверки существующего XmlDocument (используя XmlNodeReader с StringReader а не XmlDocument )

 XmlDocument x = new XmlDocument(); x.LoadXml(XmlSource); XmlReaderSettings settings = new XmlReaderSettings(); settings.CloseInput = true; settings.ValidationEventHandler += Handler; settings.ValidationType = ValidationType.Schema; settings.Schemas.Add(null, ExtendedTreeViewSchema); settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ProcessInlineSchema | XmlSchemaValidationFlags.ProcessSchemaLocation ; StringReader r = new StringReader(XmlSource); using (XmlReader validatingReader = XmlReader.Create(r, settings)) { while (validatingReader.Read()) { /* just loop through document */ } } 

И обработчик:

 private static void Handler(object sender, ValidationEventArgs e) { if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning) System.Diagnostics.Trace.WriteLine( String.Format("Line: {0}, Position: {1} \"{2}\"", e.Exception.LineNumber, e.Exception.LinePosition, e.Exception.Message)); } 

ValidationEventArgs.Message включает строку / столбец в тексте.

ValidationEventArgs.Exception имеет поля для строки и столбца.

  • Инструмент проверки XML-схемы (XSD)?
  • Подтвердите количество элементов has_many в Ruby on Rails
  • Проверьте, имеет ли браузер встроенную проверку HTML5?
  • MVC Возвращает частичный вид как JSON
  • jquery получает только все html-элементы с идентификаторами
  • Как проверить, включено ли хотя бы одно из нескольких полей ввода?
  • Проверка подлинности электронной почты с помощью jQuery
  • Определите, является ли строка C допустимым int в C
  • Как остановить Chrome от пожелтения полей ввода моего сайта?
  • Аутентификация со старым паролем больше не поддерживается, используйте пароли типа 4.1
  • Page_ClientValidate () с несколькими ValidationGroups - как показать несколько сводок одновременно?
  • Давайте будем гением компьютера.