Как я пишу незавершенный XML за пределами CDATA

Я пытаюсь записать использованию данных XML Stax, где самим содержанием является HTML

Если я пробую

xtw.writeStartElement("contents");
xtw.writeCharacters("<b>here</b>");
xtw.writeEndElement();

Я получаю это

<contents>&lt;b&gt;here&lt;/b&gt;</contents>

Затем я замечаю метод CDATA и изменяю мой код на:

xtw.writeStartElement("contents");
xtw.writeCData("<b>here</b>");
xtw.writeEndElement();

и на этот раз результат

<contents><![CDATA[<b>here</b>]]></contents>

который все еще не хорош. То, что я действительно хочу,

<contents><b>here</b></contents>

Так существует ли API/библиотека XML, который позволяет мне писать необработанный текст, не будучи в разделе CDATA? До сих пор я посмотрел на Stax и JDom, и они, кажется, не предлагают это.

В конце я мог бы обратиться к старому доброму StringBuilder, но это не будет изящно.

Обновление:

Я соглашаюсь главным образом с ответами до сих пор. Однако вместо <b>here</b> У меня мог быть 1 МБ документ HTML, который я хочу встроить в больший XML-документ. Что Вы предлагаете средства, что я должен проанализировать этот документ HTML для понимания его структуры. Я хотел бы избежать этого, если это возможно.

Ответ:

Это не возможно, иначе Вы могли создать недопустимые XML-документы.

9
задан kazanaki 9 June 2010 в 20:33
поделиться

7 ответов

Проблема в том, что это не исходный текст, это элемент, поэтому вы должны писать

xtw.writeStartElement("contents");
xtw.writeStartElement("b");
xtw.writeCData("here");
xtw.writeEndElement();
xtw.writeEndElement();
3
ответ дан 3 November 2019 в 07:46
поделиться

Я не понимаю, в чем проблема с анализом большого блока XML, который вы хотите вставить в свой вывод. Используйте синтаксический анализатор StAX для его анализа и просто напишите код для пересылки всех событий в ваш существующий сериализатор (переменная «xtw»).

0
ответ дан 3 November 2019 в 07:46
поделиться

Если большой двоичный объект html на самом деле является xhtml, я бы предложил сделать что-то вроде (в псевдокоде):

xtw.writeStartElement("contents")
XMLReader  xtr=new XMLReader();
xtr.read(blob);
Dom dom=xtr.getDom();
for(element e:dom){
    xtw.writeElement(e);
}
xtw.writeEndElement();

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

0
ответ дан 3 November 2019 в 07:46
поделиться

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

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

[См. http://www.javacommerce.com/displaypage.jsp?name=entities.sql&id=18238 ]

(2) Используйте Xinclude - в этом случае файл должен запускаться через процессор xinclude, который объединяет ссылки xinclude в вывод. Большинство процессоров xslt, а также xmllint также будут выполнять xinclude с соответствующей опцией.

[См .: http://www.xml.com/pub/a/2002/07/31/xinclude.html ]

(XSLT также можно использовать для объединения документов без использования синтаксис XInclude. XInclude просто предоставляет стандартный синтаксис)

1
ответ дан 3 November 2019 в 07:46
поделиться

Если ваши XML и HTML не слишком велики, вы можете найти обходной путь:

xtw.writeStartElement("contents");
xtw.writeCharacters("anUniqueIdentifierForReplace"); // <--
xtw.writeEndElement();

Когда у вас XML в виде строки:

xmlAsString.replace("anUniqueIdentifierForReplace", yourHtmlAsString);

Я знаю, это не очень хорошо, но это может сработать.


Изменить: Конечно, вы должны проверить, действителен ли yourHtmlAsString .

0
ответ дан 3 November 2019 в 07:46
поделиться

Проблема не «здесь», а .

Добавьте элемент в качестве дочернего элемента содержимого, и вы сможете это сделать. Любая библиотека, такая как JDOM или DOM4J, позволит вам это сделать. Общий случай состоит в том, чтобы проанализировать контент в XML DOM и добавить корневой элемент как дочерний для .

Нельзя добавлять экранированные значения вне раздела CDATA.

0
ответ дан 3 November 2019 в 07:46
поделиться

Если вы хотите вставить большой HTML-документ в XML-документ, то CDATA, имхо, лучший выход. Таким образом, вам не придется понимать или обрабатывать внутреннюю структуру, и вы сможете позже изменить тип документа с HTML на что-то другое без особых хлопот. Также я думаю вы не можете встраивать, например, инструкции DOCTYPE напрямую (т.е. как структурированные данные, сохраняющие семантику инструкции DOCTYPE). Они должны быть представлены в виде символов.

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

0
ответ дан 3 November 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: