использование CDATA в XML-файле для анализа HTML-данных - PullRequest
4 голосов
/ 09 июня 2011

У меня есть xml-файл с искаженным HTML-содержимым. Поскольку xml не может анализировать HTML-теги, такие как <br>, я использовал CDATA для сохранения и анализа.

Я использовал documentBuilder.setCoalescing (true); при разборе для восстановления данных <![CDATA[<br>test<br>data<br>]]> без тега CDATA ..

но в тегах optput <и> они заменяются на &lt; and &gt; соответственно ..

Я ожидаю эту строку в результате ...

<br>test<br>data<br>

в проанализированной строке.

Как это сделать? Любая идея ? Заранее спасибо !

ОБНОВЛЕНИЕ: у меня есть еще два вопроса в продолжение ..

1.Есть ли способ превратить искаженный HTML (например, <br>) в разборный xml (например, <br/>) с помощью кода, если да, будет ли он обрабатывать &nbsp; также?

2.Есть ли решение преобразовать HTML-текст в обычный текст через Java (например, <div>test&nbsp;text</div> в test text)?

Ответы [ 4 ]

2 голосов
/ 09 июня 2011

Объединение - это операция, при которой содержимое разделов (узлов) CDATA преобразуется в текстовые узлы и объединяется с содержимым смежных текстовых узлов.Это требование само по себе преобразования разделов CDATA в текстовые узлы налагает ограничение на то, что результирующие текстовые узлы состоят из допустимых символов XML.Это сохранит оригинальное форматирование документа;другими словами, структура узлов в исходном документе не претерпит изменений.

В результате получается поведение пяти предопределенных объектов - <, >, &, " and ', первые три будут расширены для их неизмененныхПрисутствие изменит структуру документа.

Короче говоря, вы не можете делать то, что намереваетесь делать, извлекая значения из DOM.Вам нужно будет декодировать значения в то, что вы хотите, после анализа документа.У Apache Commons Lang есть служебный класс - StringEscapeUtils, который обладает нужным методом .

2 голосов
/ 09 июня 2011

Объединение означает, что анализатор преобразует узлы CDATA в узлы Text.Когда документ сериализуется в XML, текстовое содержимое (HTML), конечно же, должно быть экранировано.Если вы хотите что-то сделать с HTML, вы должны сначала извлечь его как текст - затем вы можете отобразить его в браузере или как угодно.

ОБНОВЛЕНИЕ:

1) Вы можете использовать JTidyhttp://jtidy.sourceforge.net/index.html, для анализа содержимого HTML и создания XML или XHTML.Примерно так:

DocumentBuilder db = factory.newDocumentBuilder();
Document doc = db.parse(..)); // parse your input document

// Obtain the HTML content, may be buried deeper down or
// or scattered around in different places
String text = doc.getDocumentElement().getTextContent();

// Parse with JTidy to convert from HTML to XHTML
Tidy tidy = new Tidy();
tidy.setXHTML(true);

Document htmlDoc = tidy.parseDOM(new StringReader(text), null);
Transformer t = TransformerFactory.newInstance().newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.transform(new DOMSource(htmlDoc), new StreamResult(System.out));

2) Да.Когда у вас есть разобранный htmlDoc (выше), вы можете просмотреть его или применить XPATH или что-то еще, чтобы извлечь нужные фрагменты текста.Просто помните, что это будет выход из '\ u00A0'.Поэтому, если вы действительно хотите простой текст, вам, возможно, следует сделать

String s = text.replace('\u00A0', ' ');
1 голос
/ 16 июня 2011

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

В общем, вам понадобится анализатор XML, который позволит вам получить доступ к необработанному содержимому разделов, помеченных CDATA, и затем использовать эти необработанные данные в соответствии с вашими намерениями.

0 голосов
/ 20 июня 2011

@ Billu: Вы можете взглянуть на открытую библиотеку apache: - org.apache.commons.lang.StringEscapeUtils.Этот класс получил методы escapeXML () / escapeHTML () и unescapeXML () / escapeHTML ().Например, для решения вашей первой проблемы с преобразованием <и> вы можете использовать unescapeHTML (ваши данные).

Возможно, вам даже не понадобится хранить / передавать данные в разделе CDATA, вы можете просто использовать escapeXML (данные) вотправка / сохранение конца;и пользователь unescapeXML (данные) в конце получения / получения.

для получения дополнительной информации, вот ссылка: - StringEscapeUtils

Пожалуйста, дайте мне знать, если информация о Aboe помогла вам.

...