powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / .NET, загрузка XHTML и раскрытие entities (& etc)
7 сообщений из 7, страница 1 из 1
.NET, загрузка XHTML и раскрытие entities (& etc)
    #35939148
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ситуация такая.

Есть XHTML, в котором есть ссылка на собственное DTD, а в DTD описаны допустимые энтити (entity). Типа —

Задача:
1. Средствами .NET загрузить XHTML.
2. Провести XSL преобразование.
3. Сохранить результат в файл.

При этом энтити должны в результате остаться в изначальном виде. Т.е. в виде текста, например, —.

Проблема в том, что .NET эти энтити раскрывает при загрузке и меняет их на символы. Например, — на длинное тире. И внутри XSLT уже никак нельзя получить доступ к энтити в исходном виде - только в виде замененых символов. В результирующий фаил попадает уже не текстовое представление энтити, а символьное.

Как быть? :)
...
Рейтинг: 0 / 0
.NET, загрузка XHTML и раскрытие entities (& etc)
    #35939164
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не вижу как отредактировать свое сообщение. Там форум позаменял текст энтити на символы. Точнее браузер отражает символы. Ну надеюсь понятно где там по смыслу — а где длинное тире. :)
...
Рейтинг: 0 / 0
.NET, загрузка XHTML и раскрытие entities (& etc)
    #35939948
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravКак быть? :)
Код: plaintext
<xsl:output method="xml"/>
или
Код: plaintext
<xsl:value-of select="..." disable-output-escape="true"/>
Может поможет. А вообще не вижу ничего криминального. В спецификации W3C сказано, что сущности это псевдонимы, поэтому парсеру не важно, что написано - длинное тире или его код
...
Рейтинг: 0 / 0
.NET, загрузка XHTML и раскрытие entities (& etc)
    #35941028
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_petravКак быть? :)
Код: plaintext
<xsl:output method="xml"/>
или
Код: plaintext
<xsl:value-of select="..." disable-output-escape="true"/>
Может поможет. А вообще не вижу ничего криминального. В спецификации W3C сказано, что сущности это псевдонимы, поэтому парсеру не важно, что написано - длинное тире или его код
Не поможет. Тут такое дело, как я понимаю. Когда грузится документ все энтити тупо заменяются на символы. И никакой информации о том, что это была энтити не сохраняется.

Но касается это не всех энтити. Например, раскрытия встроенных в XML энтити (типа amp) можно избежать - именно так как Вы и описали.

Но! Это не касается внешних энтити описанных в DTD. Например, mdash. Описаны они потому что если их не описать, то XHTML в XMLDOM не загрузится. А если описать, то они тут же раскрываются в символы, а к их коду доступа получить уже не получается.

В MSXML этой проблемы не было, а в .NET есть.

Это нужно потому что много автоматической обработки xhtml и код этой обработки не знает ничего про длинные тире, только про коды.
...
Рейтинг: 0 / 0
.NET, загрузка XHTML и раскрытие entities (& etc)
    #35941035
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть свойство XmlDocument.XmlResolver - оно ответственно за раскрытие. Но вот как че делать, я понять не могу :(
...
Рейтинг: 0 / 0
.NET, загрузка XHTML и раскрытие entities (& etc)
    #35941314
NeroBrain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я эту проблему решил для себя через &amp;. На примере символа < и > в выходной поток HTML:
Код: plaintext
<xsl:text disable-output-escape="true">&amp;lt;ЭтоПростоТекст&amp;gt;</xsl:text>
Т.е. в HTML падает текст:
Код: plaintext
&lt;ЭтоПростоТекст&gt;
Как я понимаю это и требовалось?! Чтобы на выходе текст содержащий символ & НЕ преобразовывался в соответсвующий ему символ?!
...
Рейтинг: 0 / 0
.NET, загрузка XHTML и раскрытие entities (& etc)
    #35942090
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NeroBrainЯ эту проблему решил для себя через &. На примере символа < и > в выходной поток HTML:
Код: plaintext
<xsl:text disable-output-escape="true"><ЭтоПростоТекст></xsl:text>
Т.е. в HTML падает текст:
Код: plaintext
<ЭтоПростоТекст>
Как я понимаю это и требовалось?! Чтобы на выходе текст содержащий символ & НЕ преобразовывался в соответсвующий ему символ?!
Да, этого и требовалось. Я тоже пока так и сделал. Т.е. подгружаю xhtml и в строке заменяю, например:
Код: plaintext
mdash; на amp;mdash;

(Ведущие символы & я тут опустил).

А в xslt преобразовании провожу обратную операцию. И все работает, только бьет по производительности, а она там критична ибо обрабатываются большие объемы текста и дальше будет только хуже. Но это криво.

Кстати, lt и gt - встроенные в xml сущности и сними не нужно таких извратов.

Я тут нашел убер ссылку: http://msdn.microsoft.com/ru-ru/library/system.xml.xmltextreader.entityhandling.aspx

И сделал как тут написано. Это работает только если XmlTextReader создавать руками, а не через XmlReader.Create. Через XmlReader.Create создаются ридеры которые по умолчанию все сущности раскрывают. Об этом написано в статье про XmlReader.Create. В мсдн.

И действительно после этого документ начал корректно загружаться без раскрытия сущностей. Это видно по doc.InnerXml. Но в xslt они все равно уже оказываются раскрытими. Я передают из xslt в C# код ноду в таком виде: XPathNavigator parent. И parent.InnerXml уже дает развернутую сущность.

Так что проблема решилась только на половину. В принципе, это конечно не критично, но по тихонечку я рою тут.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / .NET, загрузка XHTML и раскрытие entities (& etc)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]