.NET XmlDocument LoadXML и сущности

При загрузке XML в XmlDocument, т.е.

XmlDocument document = new XmlDocument();
document.LoadXml(xmlData);

есть ли способ остановить процесс от замены сущностей? У меня странная проблема, когда у меня есть символ TM (сохраненный как объект # 8482) в xml, конвертируемый в символ TM. Насколько я понимаю, этого не должно происходить, поскольку XML-документ имеет кодировку ISO-8859-1 (в которой нет символа TM)

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
6 682
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

Что вы делаете с документом после его загрузки?

В конце концов я вывожу персонажа на веб-страницу. Проблема в том, что символ на дисплее не работает, потому что я установил responseEncoding как ISO-88559-1.

Gordon Thompson 30.09.2008 17:39

Но как вы записываете данные на веб-страницу? Если вы напишете его с помощью TextWriter с кодировкой ISO-8859-1, я бы ожидал, что он поместит в него правильный символ. (Вам действительно нужно использовать ISO-8859-1 в первую очередь, кстати?)

Jon Skeet 30.09.2008 17:54

Я храню его как строку в DTO. Это извлекается из XML путем поиска конкретного узла и последующего выполнения строки fieldValue = ((XmlNode) fieldListEnum.Current) .FirstChild.Value. В конце концов я записываю его в Repeater, используя некоторый код привязки данных

Gordon Thompson 30.09.2008 18:08

Однако я не понимаю, если данные хранятся в кодировке xml агностически, почему они не работают правильно

Gordon Thompson 30.09.2008 18:09

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

Jon Skeet 30.09.2008 18:15

Я считаю, что если вы включите содержимое объекта в раздел CDATA, он должен оставить его в покое, например.

<root>
<testnode>
<![CDATA[some text &#8482;]]>
</testnode>
</root>

Куда ты это пишешь? TextWriter? поток? какие?

Следующее сохраняет объект (ну, он заменяет его шестнадцатеричным эквивалентом) - но если вы сделаете то же самое с StringWriter, он обнаружит юникод и использует его вместо:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(@"<xml>&#8482;</xml>");
    using (MemoryStream ms = new MemoryStream())
    {
        XmlWriterSettings settings = new  XmlWriterSettings();
        settings.Encoding = Encoding.GetEncoding("ISO-8859-1");
        XmlWriter xw = XmlWriter.Create(ms, settings);
        doc.Save(xw);
        xw.Close();
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    }

Выходы:

    <?xml version = "1.0" encoding = "iso-8859-1"?><xml>&#x2122;</xml>

Ссылки на сущности не зависят от кодировки. Согласно Рекомендация W3C XML 1.0:

If the character reference begins with "&#x", the digits and letters up to the terminating ; provide a hexadecimal representation of the character's code point in ISO/IEC 10646.

Может быть, не при чтении - но они есть при записи, поскольку некоторые кодовые точки могут не существовать в этой кодировке, поэтому требуется ссылка на символ; так что все сводится к тому, как OP - это данные пишу.

Marc Gravell 30.09.2008 17:15
Ответ принят как подходящий

Это стандартное неправильное понимание набора инструментов XML. Все дело с «& # x» - это синтаксическая функция, разработанная для работы с кодировками символов. Ваш XmlDocument не является потоком символов - он избавлен от проблем с кодировкой символов - вместо этого он содержит абстрактную модель данных типа XML. Слова для этого включают DOM и InfoSet, я не уверен, что точно.

Губбины «& # x» не будут существовать в этой модели, потому что вся проблема не имеет значения, она вернется - если необходимо - когда вы преобразуете информационный набор обратно в поток символов в некоторой конкретной кодировке.

Это недоразумение достаточно распространено, чтобы оно вошло в академическую литературу как часть набора подобных причуд. Взгляните на "Xml Fever" по этому адресу: http://doi.acm.org/10.1145/1364782.1364795

Значок & # xxxx; объекты считаются символом, который они представляют. Весь XML преобразуется в Unicode при чтении, и любые такие объекты удаляются в пользу символа Unicode, который они представляют. Это включает в себя любые случаи их появления в исходном коде Unicode, такие как строка, переданная в LoadXML.

Точно так же при записи любой символ, который не может быть представлен записываемым потоком, преобразуется в & # xxxx; юридическое лицо. Нет смысла пытаться их сохранить.

Распространенной ошибкой является ожидание получения String из DOM каким-либо способом, который использует кодировку, отличную от unicode. Этого просто не происходит, независимо от того, что

Спасибо за помощь.

Я исправил свою проблему, написав функцию HtmlEncode, которая фактически заменяет все символы, прежде чем выплевывать их на веб-страницу (вместо того, чтобы полагаться на несколько неработающую функцию HtmlEncode () .NET, которая, кажется, кодирует только небольшое подмножество символы необходимы)

Другие вопросы по теме