Синтаксический анализ XML с использованием схемы в C # - PullRequest
3 голосов
/ 26 марта 2012

Я работаю над кодом, который загружает XML-файл во время выполнения.В данный момент мы используем тип XmlDocument для чтения файла xml и оборачиваем попытку try-catch вокруг оператора SelectSingleNode (это делается при малой вероятности того, что узел является нулевым или не существует, поскольку мы анализируем пользователясозданные файлы XML).

Обратите внимание : я понимаю, что XmlDocument был заменен на XDocument.Однако, поскольку мы работаем с .NET версии 3 ( в соответствии с этим документом MSDN XDocument недоступен в .NET 3), нам пока нужно придерживаться XmlDocument.Мы используем .NET 3 по разным причинам (некоторые из которых связаны со спецификацией).

Вот пример того, что мы делаем в данный момент:

private void LoadUserXMLFile ()
{
    XmlDocument xDoc = new XmlDocument();
    XmlTextReader reader = new XmlTextReader(fileName);
    reader.Read();
    xDoc.Load(reader);

    try { firstElementString = xDoc.SelectSingleNode(<path to node>).InnderText);
    catch { <exception handling here > }
    //more SelectSingleNode statements, each wrapped inside
    //individual try-catch blocks
}

Очевидно,выше приведен пример, и я упростил оператор catch.

Я написал схему для сгенерированных пользователем XML-файлов, с которыми будет работать это приложение, и мне было интересно, использовал ли я эту схему (каким-то образом) во время синтаксического анализа XML-документа мне все еще нужно будет обернуть каждый SelectSingleNode операторами try-catch?

Можно ли вообще использовать схему (каким-то образом) во время синтаксического анализа для проверки XMLдокумент имеет правильный формат и все необходимые элементы?

1 Ответ

3 голосов
/ 26 марта 2012

Да, вам нужно использовать проверяющий читатель

Вы можете использовать что-то вроде этого

XmlTextReader r = new XmlTextReader("C:\\Xml\\MyXmlFile.xml");
v.ValidationType = ValidationType.Schema;

Очевидно, что ваш xml будет ссылаться на схему, так что ссылка на нее будет решена (в самом xml), как это делается

<Employee EmployeeId="12345566" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="Employee.xsd">
   <PersonName>Krystan</PersonName>
</Employee>

если вы не можете изменить xml, вы можете использовать XmlReaderSettings следующим образом

public void SomeMethod()
{
    XmlReaderSettings xmlsettings = new XmlReaderSettings();
    xmlsettings.Schemas.Add("http://www.company.com/blah", "blah.xsd");
    xmlsettings.ValidationType = ValidationType.Schema;
    xmlsettings.ValidationEventHandler += new ValidationEventHandler(ValidationHandler);

    XmlReader reader= XmlReader.Create("somefile.xml", xmlsettings);

    while (reader.Read()) { }
}

public void ValidationHandler(object sender, ValidationEventArgs args)
    void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e)
{
    if (e.Severity == XmlSeverityType.Warning)
    {
        Console.Write("WARNING: ");
        Console.WriteLine(e.Message);
    }
    else if (e.Severity == XmlSeverityType.Error)
    {
        Console.Write("ERROR: ");
        Console.WriteLine(e.Message);
    }
}

чтобы ответить на ваш вопрос, если вы проверили по схеме и выбираете узлы, которые, как известно, находятся там, вы можете обойтись без обработки исключений для каждого узла, но, очевидно, вам следует остерегаться исключения, которое может возникнуть из-за загрузки файла и т. Д.

...