Как я могу найти положение, где строка является искаженным XML (в C #)? - PullRequest
1 голос
/ 14 октября 2008

Я пишу облегченный редактор XML, и в тех случаях, когда ввод пользователя плохо сформирован, я хотел бы указать пользователю, где проблема, или, по крайней мере, где первая проблема. Кто-нибудь знает существующий алгоритм для этого? Если просмотр кода помогает, если бы я мог заполнить метод FindIndexOfInvalidXml (или что-то подобное), это ответило бы на мой вопрос.

using System;

namespace TempConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "<?xml version=\"1.0\"?><tag1><tag2>Some text.</taagg2></tag1>";
            int index = FindIndexOfInvalidXml(text);
            Console.WriteLine(index);
        }

        private static int FindIndexOfInvalidXml(string theString)
        {
            int index = -1;

            //Some logic

            return index;
        }
    }
}

Ответы [ 4 ]

5 голосов
/ 14 октября 2008

Я бы, наверное, просто обманул. :) Это даст вам номер строки и позицию:

string s = "<?xml version=\"1.0\"?><tag1><tag2>Some text.</taagg2></tag1>";
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

try
{
    doc.LoadXml(s);
}
catch(System.Xml.XmlException ex)
{
    MessageBox.Show(ex.LineNumber.ToString());
    MessageBox.Show(ex.LinePosition.ToString());
}
2 голосов
/ 14 октября 2008

Если это не академическое упражнение, я думаю, что написание собственного синтаксического анализатора XML, вероятно, не лучший способ добиться этого. Я бы, вероятно, проверил класс XmlDocument в пространстве имен System.Xml и попытался / catch exception для методов Load () или LoadXml (). Свойство сообщения исключения должно содержать информацию о том, где произошла ошибка (номера строк / столбцов), и я подозреваю, что было бы проще использовать регулярное выражение для извлечения этих сообщений об ошибках и соответствующей информации о местоположении.

1 голос
/ 14 октября 2008

Вы должны иметь возможность просто загрузить строку в XmlDocument или XmlReader и перехватить исключение XmlException. Класс XmlException имеет свойство LineNumber и свойство LinePosition.

Вы также можете использовать XmlValidatingReader, если хотите проверить соответствие схеме в дополнение к проверке правильности оформления документа.

0 голосов
/ 14 октября 2008

Вы хотите загрузить строку в объект XmlDocument через метод load, а затем перехватить все исключения.

public bool isValidXml(string xml)
{
    System.Xml.XmlDocument xDoc = null;
    bool valid = false;
    try
    {
        xDoc = new System.Xml.XmlDocument();
        xDoc.loadXml(xmlString);
        valid = true;
    }
    catch
    {
        // trap for errors
    }
    return valid;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...