2009-06-15 5 views
0

Я пытаюсь прочитать поток xml и загрузить его в коллекцию.проблемы с чтением секции CDATA со специальными символами (кодировка ISO-8859-1)

Это работает, но у меня возникают трудности с чтением специальных символов.

E.g. если мой XML выглядит следующим образом

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<persons> 
<person> 
<firstname> 
<![CDATA[ Sébastien ]]> 
    </firstname> 
    <lastname> 
    <![CDATA[Ørvåk]]> 
    </lastname> 
</person> 
</persons> 

Я пытаюсь читать значения с помощью LINQ, как

var persons = from p in doc.Elements("persons").Elements("person") select p; 
string firstname = person.Element("firstname").Value; 
string lastname = person.Element("lastname").Value; 

но в Ørvåk О и/Себастьен ушной дает странные символы.

Кто-нибудь знает, что случилось? Я предполагаю, что он не использует кодировку ISO-8859-1.

Благодаря

+1

Как вы получили файл XML в документ? – lavinio

+0

Можете ли вы более конкретно узнать о «странных персонажах», которые вы видите? Как вы проверяете значения переменных во время выполнения? –

ответ

1

Возможно файл не в ISO-8859-1, но в UTF-8. Можете ли вы предоставить шестнадцатеричный дамп содержимого? Иногда писатель XML-файла не заботится о строке кодирования.

Также может быть, что XML-документ поступает через HTTP, а заголовки HTTP объявляют кодировку ненадлежащим образом. В разделе 4.3.3 в XML specification указано, что правила MIME переопределяют то, что сам документ содержит.

Если вы укажете свой код по ссылке вместо локальной копии, это может означать, что локальный веб-сервер не настроен должным образом ...

0

XML-файл, который вы упомянули в своем последующем совершенно верный. Итак, ваша ошибка специфична для вашего кода Javascript.

+0

Код Javascript? Что вы имеете в виду? У меня нет кода js? – 2009-06-16 11:57:06

+0

ОК, вы обнаружили, что я не знаком с Javascript. Тогда что это? C#? Вы не отметили вопрос языком, который используете. – bortzmeyer

3

Чтобы расширить ответ кто-то дал:

Есть две возможности:

  1. Файл действительно, закодированные как UTF-8, но интерпретируется вашим XML Parser, как ISO-8859-1.
  2. Файл действительно закодирован как ISO-8859-1, но интерпретируется вашим XML-парсером как UTF-8.

Чтобы определить, что именно происходит, посмотрите, что происходит с é в Sébastien. Есть две возможности, я могу себе представить:

  1. «é» превращается в два разных персонажей - вероятно, «Ã©»
  2. «é» становится одной нонсенс CHARACT или «?», и, возможно, «b» также отсутствует от имени Sébastien.

В первом случае ваш файл не тот, который вы так считаете. (Он попадает в вашу программу как данные UTF-8, но ваша программа пытается интерпретировать ее как ISO-8859-1). Посмотрите на файл xml с шестнадцатеричным редактором или еще что-нибудь, что может показать вам, что такое байты на диске.

Во втором случае я проверил, как HTTP-сервер на localhost обслуживает этот файл. (Ваша программа получает байт в формате ISO-8859-1, но интерпретирует их как UTF-8) Самый простой способ сделать это на окнах, чтобы открыть cmd незамедлительное, и выполните команду: telnet localhost 80

Когда что всплывает окно, введите следующую строку (или вырезать-вставить из stackoverflow) и нажмите дважды. Предупреждение: вы не сможете увидеть, что вы печатаете, а капитализация важна.

GET /Test/person.xml HTTP/1.0 

В ответе, обратите внимание на строку, начинающуюся с Content-Type. Это скажет вам, как веб-сервер локально обслуживает файл.

Update: Посмотрев на свой файл, он на самом деле изо-8859-1, так что я хотел бы предложить устанавливает атрибут .Encoding вашего Webclient например, как так, прежде чем сказать ему, чтобы загрузить файл:

client.Encoding = System.Text.Encoding.GetEncoding("iso-8859-1") 

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