Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Android: Document to String


Автор: CTAPbIuMABP 8.9.2009, 23:06
Как оказалось из 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 но это не вариант

есть какие-то идеи?!

Автор: CTAPbIuMABP 8.9.2009, 23:25
вот ошибка которая вылазит когда переносишь пакет к себе

Код

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
буду тут коллекционировать неработающие методы

Код

    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();
    }


пакет com.sun.org.apache.xml.internal.serialize

Автор: CTAPbIuMABP 9.9.2009, 01:28
к черту все, написал свой, не универсально конечно но может кому понадобится

Код

    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){
                result.append("<").append(root.getNodeName()).append(">");
            }else{
                result.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            }

            NodeList nodes = root.getChildNodes();
            for(int i=0,j=nodes.getLength();i<j;i++){
                Node node = nodes.item(i);
                result.append(getStringFromNode(node));
            }

            if (root.getNodeType() != 9){
                result.append("</").append(root.getNodeName()).append(">");
            }
        }
        return result.toString();
    }


появится javax.xml.transform можно будет переписать всего один метод ;)

Автор: W0LF 9.9.2009, 02:02
сорри, но что этот трансформ делает конкретно? то что процессит дерево в аутпут результат не подходит в качестве ответа =)

Автор: CTAPbIuMABP 9.9.2009, 09:55
я ж вчера вроде не пил, мысль излагал ровно...

есть дом дерево созданое вот таким образом
Код

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument();
Element elt = doc.createElement("tag");
doc.appendChild(elt);


в результату этот объект Document надо превратить в стоку

Код

<?xml version="1.0" encoding="UTF-8"?>
<tag></tag>


для этого в J2EE есть пакет javax.xml.transform , который работает способом показаным в первом посте

в Android SDK этого пакета нет.

а то что процесит дерево в аутпут типа

Код

System.out.print(doc.toString());


выглядит примерно как [#document: null]

Автор: hunterman 28.1.2010, 15:09
подыму эту тему выше с уточнением что атрибуты у нодов не идут в исходящую строку, вот дописал, т.к. пишу под 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 < root.getAttributes().getLength(); ++k) {
                    attrs.append(" ").append(
                            root.getAttributes().item(k).getNodeName()).append(
                            "=\"").append(
                            root.getAttributes().item(k).getNodeValue())
                            .append("\" ");
                }
                result.append("<").append(root.getNodeName()).append(" ")
                        .append(attrs).append(">");
            } else {
                result.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
            }

            NodeList nodes = root.getChildNodes();
            for (int i = 0, j = nodes.getLength(); i < j; i++) {
                Node node = nodes.item(i);
                result.append(getStringFromNode(node));
            }

            if (root.getNodeType() != 9) {
                result.append("</").append(root.getNodeName()).append(">");
            }
        }
        return result.toString();
    }


ps еще есть и такой метод http://www.ibm.com/developerworks/opensource/library/x-android/index.html#list11

Автор: ivanovpv 28.1.2010, 18:41
Пора по-моему делать отдельную конфу под Андроид... А то вроде бы Java, относится к мобилам, но никак не катит J2ME

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)