XML Reader на SQL Table возвращает неправильный XML - PullRequest
2 голосов
/ 23 марта 2009

У меня есть таблица SQL, в которой есть столбец varchar (8), в котором иногда содержатся двоичные данные. (0x01, 0x02 и т. Д.). (Изменение формата или содержимого столбца не вариант.)

Когда я захожу в SQL Server 2005 Management Studio и запускаю запрос:

select * 
 from mytable 
 where clientID = 431620
 for xml auto

Я получаю полезные результаты. Обратите внимание, как кодируется proc_counts:

<mytable clientID="431620" recno="19014235" pdate="2008-03-04T00:00:00"
   proc_counts="&#x1;&#x1;&#x2;&#x1;" otherstuff="foobar" 
   date="2008-02-17T00:00:00"/>

Отлично действительный XML, AFAIK. Теперь, когда я на самом деле пишу код C # для чтения этой строки, я получаю исключение во время ReadOuterXml:

SqlCommand cmd = new SqlCommand("select * from testing xml auto", connection);
using (XmlReader xrd = cmd.ExecuteXmlReader())
{
    xrd.Read();
    while (xrd.ReadState != ReadState.EndOfFile)
    {
        string s = xrd.ReadOuterXml();
        records.Add(s);
    }
}

Это выдает: XmlException не обработан. '', шестнадцатеричное значение 0x01 является недопустимым символом . Я хочу XML сверху, но у меня недостаточно Google-фу, чтобы понять, почему я его не получаю. Предложения?


Чтобы создать таблицу с данными такого типа, этот код Transact SQL работает в SSMS:

create table testing
(clientid int, proc_counts varchar(8));
insert into testing values (1, 'normal');
insert into testing values (2, char(65) + char(1) + char(65));
select * from testing for xml auto;

Обновление: вскрытие и обходной путь

Доммер, вероятно, прав, что именно свойство Normalization в XmlTextReader вызывает у меня проблемы. Дело в том (как вы можете видеть из комментариев), я обнаружил, что практически невозможно перейти от (SqlCommand).ExecuteXmlReader() к чему-либо, что позволит мне приблизиться к свойству Normalization XmlTextReader. Часто документация Microsoft по этому вопросу была противоречивой или просто неверной.

Итак, я остановился на обходном пути. Если я просто использую SqlDataReader, чтобы впитать вывод, все в порядке. XML выглядит отлично и довольно хорошо разбирает.

StringBuilder sb = new StringBuilder();
using(SqlDataReader dr = cmd.ExecuteReader())
{
    while(rdr.Read())
        sb.Append((string)rdr[0]);
}

Ответы [ 2 ]

4 голосов
/ 23 марта 2009

Это связано со свойством XmlTextReader.Normalization. Это свойство имеет значение false, когда вы явно создаете XmlTextReader, поэтому «недопустимые» символы декодируются. Когда XmlTextReader создается неявно, для параметра Normalization устанавливается значение true.

Недвижимость обсуждается здесь:

http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.normalization.aspx

Если вы выполняете обработку «вручную» - то есть создаете XmlTextReader - я думаю, что вы избежите ошибки.

UPDATE:

Изменения в более поздних версиях платформы означают, что «ASP.NET 2.0+» может быть «XmlReaderSettings.CheckCharacters = false» Объект XmlReaderSettings можно передать в XmlReader.Create.

1 голос
/ 23 марта 2009

Исключение говорит вам правду. SQL Server, по-видимому, разрешает отображение недопустимого XML. Попробуйте это:

select *  from mytable  where clientID = 431620 for xml auto, BINARY BASE64
...