#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 не знает.