В данный момент я работаю с JDOM. Я не могу придумать решение, которое, по сути, должно быть легкой проблемой.

У меня есть допустимая строка XHTML:

<b>M&amp;A</b> &euro;

Как мне вставить это в XML DOM следующим образом?

<parentNode>
<b>M&amp;A</b>

</parentNode>

(этот XML затем передается преобразователю XSL, который затем отображает XHTML для браузера)

Я придумал следующие «псевдо» решения, но не уверен, возможны ли они:

Отмените экранирование сущностей, которые не являются XML-сущностями, а затем вставьте.
Переинформатируйте только XML, затем HTML отмените экранирование всей строки, затем вставьте.

Тарас

2
Trent 11 Июн 2009 в 22:11

3 ответа

Лучший ответ

Я думаю, вы можете использовать JTidy для преобразования именованных сущностей в нумерованные. После этого XHTML также является допустимым XML.

2
Tomalak 11 Июн 2009 в 22:37
Вот что я в итоге сделал: * Разобрать входной фрагмент XHTML как HTML в DOM с помощью JTidy * Извлечь все дочерние узлы тела с помощью xpath (/ html / body / node ()) * Вставить извлеченные узлы в целевой XML DOM. Предостережение заключалось в том, что «это действительный объект XHTML, но не действительный объект HTML. Это означало, что на первом этапе последовательность: 'рассматривается не как апостроф, а как 6 отдельных символов. Я исправил это, заменив все экземпляры 'числовой ссылкой (немного взлома, но это работает)
 – 
Trent
14 Июн 2009 в 16:16
Я уверен, что есть способ сказать JTidy заменить все именованные ссылки на сущности пронумерованными. В командной строке это «-n». Также есть переключатель, позволяющий создавать действительный XML. Я бы подумал, что библиотека Java может делать то же самое.
 – 
Tomalak
14 Июн 2009 в 16:27
Извините, интервалы выше немного перепутались. Я нашел свойство -n в JTidy, однако я не смог найти для него вариант синтаксического анализа XHTML вместо HTML - он анализирует ввод как HTML, что означает, что он не распознает объект '. Я действительно взглянул на источник, чтобы увидеть, могу ли я добавить объект, но безуспешно. Фактически я нашел исходный код, отвечающий за определение сущностей (EntityTable), и обнаружил, что 'не было определено (другие 252 сущности HTML были
 – 
Trent
15 Июн 2009 в 13:57

Хотя € является допустимым объектом XHTML, он не является допустимым объектом XML.

К сожалению, я ничего не знаю о JDOM, но, если это возможно, вы можете попробовать добавить DTD объявления сущностей, например <!ENTITY euro "€">. И, возможно, поместить все теги XHTML в их собственное пространство имен (<parentNode xmlns:x="http://www.w3.org/1999/xhtml"><x:b>...</x:b></parentNode>)

0
drdaeman 11 Июн 2009 в 22:29
Это решение рассматривалось, однако нам пришлось бы сделать это для всех, возможно, HTML (XHTML?) Объектов - cookwood.com/html/extras/entities.html
 – 
Trent
12 Июн 2009 в 13:35

Создайте строку, содержащую

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>

+

Ваш XHTML-контент, в данном случае <b>M&amp;A</b> &euro;

+

</html>

А затем проанализируйте эту строку, чтобы получить документ. Затем получите все содержимое внутри корневого элемента, который будет вашим содержимым XHTML, и поместите его в элемент parentNode. Возможно, вам придется принять во внимание, что контент взят из другого документа.

0
George Bina 11 Июн 2009 в 23:00
1
Я попробовал этот подход и столкнулся с проблемой, заключающейся в том, что при попытке проанализировать строку в документе, поскольку & eruo; не является объектом XML, строка по существу содержит неэкранированный амперсанд, который является недопустимым XML.
 – 
Trent
12 Июн 2009 в 13:31