Как мне заменить HTML-экранирования во входном потоке перед его преобразованием в XML?

#java #android

#java #Android

Вопрос:

У меня есть входной поток, который преобразуется в XML и читается. Когда я перехожу к некоторым текстовым элементам в XML, они усекаются. Я полагаю, что анализатор удаляет все после экранированного HTML, такого как amp; Вот код, получающий входной поток, а затем текстовый элемент.

 String hvurl = "https://www.mysite.com/api/a/"   answerId;
in = OpenHttpConnection(hvurl); 

Document doc = null;
DocumentBuilderFactory dbf = 
    DocumentBuilderFactory.newInstance();
DocumentBuilder db;

try {
    db = dbf.newDocumentBuilder();
    doc = db.parse(in);

} catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (SAXException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}     

...
//Now when I get the text element, it's truncated
//---get the <varietalTitle> elements under the <varietal> 
// element---
NodeList varietalTitleNodes = 
    (varietalElement).getElementsByTagName("varietaltitle");

//---convert a Node into an Element---
Element varietalTitleElement = (Element) varietalTitleNodes.item(0);

//---get all the child nodes under the <varietaltitle> element---
NodeList varietalTitleTextNodes = 
    ((Node) varietalTitleElement).getChildNodes();

//---retrieve the text of the <varietalid> element---
strVarietalTitle = ((Node) varietalTitleTextNodes.item(0)).getNodeValue();
  

Комментарии:

1. Можете ли вы привести пример «экранирования HTML», которое компилятор XML выдает неправильно?

2. <varietaldesc> (ZIHN-fuhn-dehl): Пряное красное вино с черникой и ежевикой подходит. </varietaldesc>

3. Когда я получаю значение node в строке, strVarietalTitle = (ZIHN-fuhn-dehl): Пряное красное вино с черникой

Ответ №1:

Не могу понять, где возникает проблема. Я предполагаю использовать normalize() метод, как показано ниже.

Попробуйте это:

  strVarietalTitle = ((Node) varietalTitleTextNodes.item(0)).getNodeValue().normalize();
  

Из документации Normalize():

Переводит все текстовые узлы во всей глубине поддерева под этим узлом, включая узлы атрибутов, в «обычную» форму, где текстовые узлы разделяет только структура (например, элементы, комментарии, инструкции по обработке, разделы CDATA и ссылки на сущности), т. Е. нет ни смежных текстовых узлов, ни пустых текстовых узлов. Это можно использовать для обеспечения того, чтобы DOM-представление документа было таким же, как если бы он был сохранен и повторно загружен, и полезно при выполнении операций (таких как поиск XPointer [XPointer]), которые зависят от конкретной древовидной структуры документа. Если параметр «normalize-characters» объекта DOMConfiguration, прикрепленного к Node.ownerDocument, имеет значение true, этот метод также полностью нормализует символы текстовых узлов. Примечание: В случаях, когда документ содержит разделы CDATASection, одной операции нормализации может быть недостаточно, поскольку XPointers не различают текстовые узлы и узлы CDATASection.

Комментарии:

1. Я также не уверен, где возникает проблема. Между преобразованием inputstream в XML и последующим получением значения node в строку. <varietaldesc> (ZIHN-fuhn-dehl): Пряное красное вино с черникой и ежевикой подходит. </varietaldesc> это фактический XML, который я могу видеть в браузере, но когда я получаю конечную строковую переменную, все, что я получаю, это (ZIHN-fuhn-dehl): пряное красное вино с черникой

2. Спасибо, normalized устранил проблему. попробуйте { db = dbf.newDocumentBuilder(); doc = db.parse(в); doc.getDocumentElement().normalize();

3. @Poolczar @DroidBase Большое, очень большое спасибо Poolczar и DroidBase за экономию моего драгоценного времени, я также сталкивался с такой проблемой с ‘ . normalize() решила эту проблему.

4. поддержано 1, я не могу дать вам больше, иначе я поддержу многих. Еще раз спасибо DroidBase.

Ответ №2:

Анализатор XML должен справляться с символьными объектами, такими как «amp;» … предполагая, что это то, о чем вы говорите.

Одна из возможностей заключается в том, что ваш ввод содержит определенные именованные объекты, о которых анализатор XML не знает.