Как я проверяю документ XML по DTD в C #? - PullRequest
5 голосов
/ 02 ноября 2009

Я не хочу делать что-то необычное, я просто хочу убедиться, что документ действителен, и вывести сообщение об ошибке, если это не так. Google указал мне на это , но кажется, что XmlValidatingReader устарел (по крайней мере, так говорит мне MonoDevelop).

Редактировать: я пытаюсь получить совет Мехрдада, но у меня проблемы. Я думаю, что у меня есть большая часть этого, но я не могу найти OnValidationEvent нигде. Где я могу получить OnValidationEvent?

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.DTD;
settings.ValidationEventHandler += new ValidationEventHandler(/*trouble is here*/);
XmlReader validatingReader = XmlReader.Create(fileToLoad, settings);

Ответы [ 3 ]

4 голосов
/ 02 ноября 2009

Вместо непосредственного создания XmlValidatingReader класса необходимо создать соответствующий XmlReaderSettings объект и передать его в качестве аргумента методу XmlReader.Create :

var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD };
settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent);
var reader = XmlReader.Create("file.xml", settings);

Остальное без изменений.

P.S. OnValidationEvent - это имя метода, который вы объявляете для обработки событий проверки. Очевидно, что вы можете удалить строку, если не хотите подписываться на события проверки, инициируемые XmlReader.

2 голосов
/ 02 ноября 2009
var messages = new StringBuilder();
var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD };
settings.ValidationEventHandler += (sender, args) => messages.AppendLine(args.Message);
var reader = XmlReader.Create("file.xml", settings);

if (messages.Length > 0)
{
    // Log Validation Errors
    // Throw Exception
    // Etc.
}

ValidationEventHandler

Лямбда-выражения

Тип Вывод

0 голосов
/ 26 мая 2013

полное описание:

  1. В Visual Studio .NET создайте новое консольное приложение Visual C # проект с именем ValidateXml. Добавьте два использования операторов в начале Class1.cs следующим образом:

    using System.Xml;        // for XmlTextReader and XmlValidatingReader
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later)
    
  2. В Class1.cs объявите логическую переменную с именем isValid перед начало метода Main выглядит следующим образом:

    private static bool isValid = true;      // If a validation error occurs,
                                             // set this flag to false in the
                                             // validation event handler. 
    
  3. Создание объекта XmlTextReader для чтения XML-документа из текста файл в методе Main, а затем создайте XmlValidatingReader для проверьте эти данные XML следующим образом:

    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml");
    XmlValidatingReader v = new XmlValidatingReader(r);
    
  4. Свойство ValidationType объекта XmlValidatingReader указывает тип требуемой проверки (DTD, XDR или Схема). Установите это свойство в DTD следующим образом:

    v.ValidationType = ValidationType.DTD;
    
  5. Если возникают какие-либо ошибки проверки, проверяющий считыватель генерирует событие проверки. Добавьте следующий код для регистрации проверки обработчик событий (вы будете реализовывать MyValidationEventHandler метод на шаге 7):

    v.ValidationEventHandler += 
       new ValidationEventHandler(MyValidationEventHandler);
    
  6. Добавьте следующий код для чтения и проверки документа XML. Если есть возникают ошибки проверки, MyValidationEventHandler вызывается устранить ошибку. Этот метод устанавливает isValid в false (см. Шаг 8). Вы можете проверить статус isValid после проверки, чтобы увидеть, документ действителен или недействителен.

    while (v.Read())
    {
       // Can add code here to process the content.
    }
    v.Close();
    
    // Check whether the document is valid or invalid.
    if (isValid)
       Console.WriteLine("Document is valid");
    else
       Console.WriteLine("Document is invalid");
    
  7. Запишите метод MyValidationEventHandler после метода Main как следующим образом:

    public static void MyValidationEventHandler(object sender, 
                                                ValidationEventArgs args) 
    {
       isValid = false;
       Console.WriteLine("Validation event\n" + args.Message);
    }
    

Создайте и запустите приложение. Приложение должно сообщить, что документ XML является действительным. например:. В Visual Studio .NET измените ProductWithDTD.xml, чтобы сделать его недействительным (например, удалите элемент <AuthorName>M soliman</AuthorName>). Запустите приложение еще раз. Вы должны получить следующее сообщение об ошибке:

Validation event
Element 'Product' has invalid content. Expected 'ProductName'.
An error occurred at file:///C:/MyFolder/ProductWithDTD.xml(4, 5).
Document is invalid
...