Как преобразовать строку в XML Document. Создаем String из Document
В этой статье мы познакомимся с простым способом преобразования строки в объект XML Document и обратной конвертации XML Document в строку. А также разберем зачем это нужно.
Из String в XML Document и наоборот
Программируя на Java часто приходится иметь дело со строками, которые содержат в себе XML разметку. Такие объекты нужно как-то обрабатывать. Для этого нам нужно преобразовать (конвертировать) такую строку c XML в объект Document ( org.w3c.dom.Document ). Похожая задача конвертации стоит во время отладки, когда нам потребуется преобразовать XML Document в объект String.
В этой статье мы разбирались как сделать красивый и читабельный вывод неотформатированной строки с XML разметкой. В этой статье нас больше интересует правильный способ преобразования между String и объектом Document.
Конвертация в String из XML Document и наоборот на примере
Напишем 2 метода для конвертации и обратного преобразования XML и String:
Метод stringToDocument(String xmlString) принимает на вход строку из XML разметкой, а затем парсит ее и возвращает в виде Document DOM. Мы будем использовать InputSource и StringReader для этого.
Метод documentToString(Document document) принимает на вход Document и преобразовывает его в объект String. Для этого используются классы Transformer , StringWriter и StreamResult пакета javax.xml.transform .
Напишем класс DocumentToStringConverter и реализуем этим методы:
Источник
Android document to string
CTAPbIuMABP
Дата 8.9.2009, 23:06 (ссылка) | (нет голосов) Загрузка .
Шустрый
Профиль Группа: Участник Сообщений: 92 Регистрация: 17.2.2006 Где: Киев
Репутация: нет Всего: 1
Как оказалось из android sdk выкинули пакет javax.xml.transform и теперь преобразовать Node в String нормальным способом нельзя.
под нормальным способом я подразумеваю нечто вроде
Код
public static String getStringFromNode(Node node) throws TransformerException < StringWriter writer = new StringWriter(); TransformerFactory.newInstance().newTransformer().transform(new DOMSource(node), new StreamResult(writer)); return writer.toString(); >
попытка перетачить пакет javax.xml.transform к себе в приложение вызвала недовольство со стороны компилятора
гугл предлагает использовать StringBuilder но это не вариант
Дата 8.9.2009, 23:25 (ссылка) | (нет голосов) Загрузка .
Шустрый
Профиль Группа: Участник Сообщений: 92 Регистрация: 17.2.2006 Где: Киев
Репутация: нет Всего: 1
вот ошибка которая вылазит когда переносишь пакет к себе
Код
Information:Compilation completed with 12 errors and 0 warnings Information:12 errors Information:0 warnings Error:trouble processing «javax/xml/transform/dom/DOMSource.class»: Error:Attempt to include a core VM class in something other than a core library. Error:It is likely that you have attempted to include the core library from a desktop Error:virtual machine into an application, which will most assuredly not work. If Error:you really intend to build a core library — which is only appropriate as Error:part of creating a full virtual machine binary, as opposed to compiling an Error:application — then use the «—core-library» option to suppress this error Error:message. If you go ahead and use «—core-library» but are in fact building Error:an application, then please be aware that your build will still fail at some Error:point; you will simply be denied the pleasure of reading this helpful error Error:message. Error:1 error; aborting
заодно выискалось решение с XmlSerializer но оно ИМХО мало чем отличается от StringBuilder
Приветствуются любые варианты решения проблемы, от перетаскивания пакета до собственного плохотестированого класса.
CTAPbIuMABP
Дата 9.9.2009, 00:21 (ссылка) | (нет голосов) Загрузка .
Шустрый
Профиль Группа: Участник Сообщений: 92 Регистрация: 17.2.2006 Где: Киев
Репутация: нет Всего: 1
буду тут коллекционировать неработающие методы
Код
public static String getStringFromNode(Document doc) throws IOException < OutputFormat format = new OutputFormat (doc); StringWriter stringOut = new StringWriter (); XMLSerializer serial = new XMLSerializer (stringOut, format); serial.serialize(doc); return stringOut.toString(); >
Это сообщение отредактировал(а) CTAPbIuMABP — 9.9.2009, 00:21
CTAPbIuMABP
Дата 9.9.2009, 01:28 (ссылка) | (голосов:1) Загрузка .
Шустрый
Профиль Группа: Участник Сообщений: 92 Регистрация: 17.2.2006 Где: Киев
Репутация: нет Всего: 1
к черту все, написал свой, не универсально конечно но может кому понадобится
Код
public static String getStringFromNode(Node root) throws IOException <
Дата 9.9.2009, 09:55 (ссылка) | (нет голосов) Загрузка .
Шустрый
Профиль Группа: Участник Сообщений: 92 Регистрация: 17.2.2006 Где: Киев
Репутация: нет Всего: 1
я ж вчера вроде не пил, мысль излагал ровно.
есть дом дерево созданое вот таким образом
Код
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); Element elt = doc.createElement(«tag»); doc.appendChild(elt);
в результату этот объект Document надо превратить в стоку
для этого в J2EE есть пакет javax.xml.transform , который работает способом показаным в первом посте
в Android SDK этого пакета нет.
а то что процесит дерево в аутпут типа
Код
System.out.print(doc.toString());
выглядит примерно как [#document: null]
hunterman
Дата 28.1.2010, 15:09 (ссылка) | (нет голосов) Загрузка .
Профиль Группа: Участник Сообщений: 36 Регистрация: 3.12.2008 Где: Херсон
Репутация: нет Всего: нет
подыму эту тему выше с уточнением что атрибуты у нодов не идут в исходящую строку, вот дописал, т.к. пишу под sdk 1.5 и там данная проблема еще актуальна то может кому то еще понадобиться.
Код
public static String getStringFromNode(Node root) throws IOException <
StringBuilder result = new StringBuilder();
if (root.getNodeType() == 3) result.append(root.getNodeValue()); else < if (root.getNodeType() != 9) < StringBuffer attrs = new StringBuffer(); for (int k = 0; k «); > else < result.append(» «); >
NodeList nodes = root.getChildNodes(); for (int i = 0, j = nodes.getLength(); i «); > > return result.toString(); >
Это сообщение отредактировал(а) hunterman — 28.1.2010, 15:19
ivanovpv
Дата 28.1.2010, 18:41 (ссылка) | (нет голосов) Загрузка .
Варвар
Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва
Репутация: 10 Всего: 28
Прежде чем задать вопрос прочтите это!
Литература по Java находится здесь.
Литературу по Java обсуждаем здесь.
Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс «транслит» (возле кнопок кодов) если у Вас нет русских шрифтов.
Действия модераторов можно обсудить здесь
С просьбами о написании курсовой, реферата и т.п. обращаться сюда FAQ раздела лежит здесь!
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)