недопустимый символ в документе xml - PullRequest
6 голосов
/ 24 июня 2010

У меня есть программа, которая генерирует XML-файлы из данных из базы данных. В кратком коде это делает следующее:

string dsn = "a db connection string";
XmlDocument d = new XmlDocument();
using (SqlConnection con = new SqlConnection(dsn)) {
    con.Open();
    string sql = "select id as Id, comment as Comment from Test where ... ";
    using (SqlCommand cmd = new SqlCommand(sql, con)) {
        DataSet ds = new DataSet("EXPORT");
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(ds, "Test");
        d.LoadXml(ds.GetXml());
    }
}
d.Save(@"c:\test.xml");

Когда я смотрю на xml-файл, он содержит недопустимый символ & # x 1 A;

<EXPORT>
  <Test>
    <Id>2</Id>
    <Comment> Keyboard NB&#x1A;5 linked</Comment>
  </Test>
</EXPORT>

Этот XML-файл не может быть открыт браузером Firefox с неверным знаком ...

Этот объект зарезервирован в ISO 8859-1 и CP1252 и не должен отображаться браузерами. Но почему XmlDocument выводит xml, который не может быть проанализирован как действительный, или это действительный документ xml, который просто не может быть проанализирован браузерами или импортирован в Excel и т. Д. Есть ли простой способ избавиться от этих зарезервированных «недопустимых символов» или кодировать их так, чтобы у браузеров не было с этим проблем?

Большое спасибо за ваше мнение и советы

Ответы [ 6 ]

3 голосов
/ 21 октября 2010

Не все символы представимы в XML.

В XML 1.0 нельзя использовать ни один из символов со значениями менее 0x20, кроме TAB (0x09), LF (0x0A) и CR (0x0D)..

В XML 1.1 можно использовать практически все, кроме NUL (0x00).

Если у вас есть возможность использовать XML 1.1, и , получающая программа поддерживаетXML 1.1 (не многие это делают), тогда вы можете избежать 0x1A как &#26; или &#x1A;.

Заключение его в CDATA также не является решением;CDATA - это просто удобство для экранирования групп символов, отличающихся от стандартного & -механизма.

В противном случае вам потребуется удалить его перед сериализацией.

1 голос
/ 21 октября 2010

Посмотрите на эту XML-ошибку синтаксического анализа недопустимого символа

Вывод (как я понял): в XML 1.0 невозможно сохранить это значение.

1 голос
/ 16 июля 2010

Я сталкивался с этим несколько раз при создании / манипулировании XML из данных SQL.

Но почему XmlDocument выводит xml, который не может быть проанализирован как действительный, или это действительный документ xmlкоторые просто не могут быть проанализированы браузерами или импортированы в Excel и т. д.

XmlDocument не выполняет никакой проверки данных, которые вы отправляете, он оставляет их вам (разработчику).Этот XML-документ должен быть недействительным почти во всех вещах, использующих XML (но я могу ошибаться в этом ... вы всегда можете проверить его: P)

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

Вы также можете попробовать поместить свой XML-файл в блок CData, но это приведет к расширению файла.чуть-чуть (не уверен, насколько большим будет ваш файл)

0 голосов
/ 21 октября 2010

Убедитесь, что экранированы объекты XML, например. & => &amp; В противном случае оберните данные в CDATA http://en.wikipedia.org/wiki/CDATA

0 голосов
/ 24 июня 2010

Я думаю, вы обрабатываете символ Control-Z (конец текстового файла).Возможно ли это?

0 голосов
/ 24 июня 2010

Посмотрите на этот ответ, чтобы увидеть, помогает ли он:

.NET DataSet.GetXml () - какая кодировка по умолчанию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...