Я пытаюсь записать использованию данных XML Stax, где самим содержанием является HTML
Если я пробую
xtw.writeStartElement("contents");
xtw.writeCharacters("<b>here</b>");
xtw.writeEndElement();
Я получаю это
<contents><b>here</b></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-документы.
Проблема в том, что это не исходный текст, это элемент, поэтому вы должны писать
xtw.writeStartElement("contents");
xtw.writeStartElement("b");
xtw.writeCData("here");
xtw.writeEndElement();
xtw.writeEndElement();
Я не понимаю, в чем проблема с анализом большого блока XML, который вы хотите вставить в свой вывод. Используйте синтаксический анализатор StAX для его анализа и просто напишите код для пересылки всех событий в ваш существующий сериализатор (переменная «xtw»).
Если большой двоичный объект 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();
или что-то в этом роде. Однажды мне пришлось сделать что-то подобное, но я использовал другую библиотеку.
Если вы хотите, чтобы 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 просто предоставляет стандартный синтаксис)
Если ваши XML и HTML не слишком велики, вы можете найти обходной путь:
xtw.writeStartElement("contents");
xtw.writeCharacters("anUniqueIdentifierForReplace"); // <--
xtw.writeEndElement();
Когда у вас XML в виде строки:
xmlAsString.replace("anUniqueIdentifierForReplace", yourHtmlAsString);
Я знаю, это не очень хорошо, но это может сработать.
Изменить: Конечно, вы должны проверить, действителен ли yourHtmlAsString
.
Проблема не «здесь», а
.
Добавьте элемент
в качестве дочернего элемента содержимого, и вы сможете это сделать. Любая библиотека, такая как JDOM или DOM4J, позволит вам это сделать. Общий случай состоит в том, чтобы проанализировать контент в XML DOM и добавить корневой элемент как дочерний для
.
Нельзя добавлять экранированные значения вне раздела CDATA.
Если вы хотите вставить большой HTML-документ в XML-документ, то CDATA, имхо, лучший выход. Таким образом, вам не придется понимать или обрабатывать внутреннюю структуру, и вы сможете позже изменить тип документа с HTML на что-то другое без особых хлопот. Также я думаю вы не можете встраивать, например, инструкции DOCTYPE напрямую (т.е. как структурированные данные, сохраняющие семантику инструкции DOCTYPE). Они должны быть представлены в виде символов.
(Это в первую очередь ответ на ваше обновление, но, увы, у меня недостаточно репутации, чтобы комментировать...............)