проверить содержимое строки XML, включая кодирование, используя C # - PullRequest
1 голос
/ 28 мая 2011

Мне нужно проверить строку, содержащую данные XML, проверка схемы не требуется. Все, что мне нужно сделать, это убедиться, что XML правильно сформирован и правильно закодирован. Например, я хочу, чтобы мой код идентифицировал этот фрагмент XML как недействительный:

<?xml version="1.0" encoding="utf-8"?>
<parentNode> Positions1 ’</parentNode>

Использование метода LoadXML в XMLDocument не работает, при загрузке фрагмента выше не выдается никаких ошибок.

Мне известно, как это сделать, если содержимое было в файле XML, следующий фрагмент кода показывает, что:

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.ConformanceLevel = ConformanceLevel.Document;
readerSettings.CheckCharacters = true;
readerSettings.ValidationType = ValidationType.None;

xmlReader = XmlReader.Create(xmlFileName, readerSettings);
XmlDocument xdoc = new XmlDocument();
xdoc.Load(xmlReader);

Итак, если не считать временный файл для записи содержимого моей строки xml, а затем создать экземпляр XmlReader для его чтения, есть ли альтернатива? Цените, если кто-то может направить меня в правильном направлении с этой проблемой.

Ответы [ 2 ]

1 голос
/ 28 мая 2011

Вы не до конца понимаете, что означает кодировка.Если в памяти есть строка .Net, она больше не является «необработанными данными» и по этой причине не имеет кодировки.И так LoadXML ингоры не зря.То, что вы хотите сделать, не имеет особого смысла.Но если вы действительно хотите это сделать:

Вы можете преобразовать вашу строку в поток в памяти, чтобы вам не приходилось писать временный файл.Затем вы можете использовать этот поток вместо xmlFileName при вызове XmlReader.Create.

0 голосов
/ 02 июня 2011

Ахим,

Спасибо за ваши подробные ответы, я наконец смог найти решение, которое соответствует моим потребностям.Он включает в себя извлечение байтов из строки 'unicode' и затем преобразование байтов в кодировку utf8.

        try
        {
            byte[] xmlContentInBytes = new System.Text.UnicodeEncoding().GetBytes(xmlContent);

            System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(false, true);
            utf8.GetChars(xmlContentInBytes);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return false;
        }
...