Java / DOM: получить XML-содержимое узла - PullRequest
7 голосов
/ 27 января 2009

Я анализирую XML-файл на Java с помощью W3C DOM. Я застрял в конкретной проблеме, я не могу понять, как получить весь внутренний XML-узел.

Узел выглядит так:

<td><b>this</b> is a <b>test</b></td>

Какую функцию я должен использовать, чтобы получить это:

"<b>this</b> is a <b>test</b>"

Ответы [ 6 ]

4 голосов
/ 28 декабря 2010

Я знаю, что это было задано давно, но для следующего человека, который ищет (был я сегодня), это работает с JDOM:

JDOMXPath xpath = new JDOMXPath("/td");
String innerXml = (new XMLOutputter()).outputString(xpath.selectNodes(document));

Это передает список всех дочерних узлов в outputString, который будет сериализовать их в порядке.

3 голосов
/ 27 января 2009

Вы должны использовать API преобразования / xslt, используя ваш узел в качестве узла, который нужно преобразовать, и поместить результат в новый StreamResult (new StringWriter ()); , См. как сделать красивую печать xml-из-java

2 голосов
/ 13 марта 2012

Что вы скажете по этому поводу? У меня была такая же проблема сегодня на Android, но мне удалось сделать простой "сериализатор"

private String innerXml(Node node){
        String s = "";
        NodeList childs = node.getChildNodes();
        for( int i = 0;i<childs.getLength();i++ ){
            s+= serializeNode(childs.item(i));
        }
        return s;
    }

    private String serializeNode(Node node){
        String s = "";
        if( node.getNodeName().equals("#text") ) return node.getTextContent();
        s+= "<" + node.getNodeName()+" ";
        NamedNodeMap attributes = node.getAttributes();
        if( attributes!= null ){
            for( int i = 0;i<attributes.getLength();i++ ){
                s+=attributes.item(i).getNodeName()+"=\""+attributes.item(i).getNodeValue()+"\"";
            }
        }
        NodeList childs = node.getChildNodes();
        if( childs == null || childs.getLength() == 0 ){
            s+= "/>";
            return s;
        }
        s+=">";
        for( int i = 0;i<childs.getLength();i++ )
            s+=serializeNode(childs.item(i));
        s+= "</"+node.getNodeName()+">";
        return s;
    }
0 голосов
/ 24 августа 2009

Для удаления ненужных тегов, вероятно, можно использовать такой код:

DOMConfiguration config = serializer.getDomConfig (); config.setParameter ("canonical-form", true);

Но это не всегда будет работать, потому что "canonical-form = true" необязательно

0 голосов
/ 28 января 2009

node.getTextContent ();

Вы должны использовать JDom из Dom4J для обработки узлов, если не по каким-либо другим причинам, для правильной обработки пробелов.

0 голосов
/ 27 января 2009

э-э ... вы также можете вызвать toString () и просто отрубить начальный и конечный теги вручную или с помощью регулярных выражений.

edit: toString () не делает то, что я ожидал. В книге O'Reilly Java & XML рассказывается о модуле загрузки и сохранения Java DOM.

См., В частности, LSSerializer , который выглядит очень многообещающе. Вы можете либо вызвать writeToString (node) и отрубить начальный и конечный теги, как я предложил, или попробовать использовать LSSerializerFilter , чтобы не печатать теги верхнего узла (не уверен, что это сработает; никогда раньше не использовал LSSerializer.)

Чтение книги О'Рейли, кажется, указывает на то, что вы делаете что-то подобное:

 DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
 DOMImplementationLS lsImpl = 
   (DOMImplementationLS)registry.getDOMImplementation("LS");
 LSSerializer serializer = lsImpl.createLSSerializer();
 String nodeString = serializer.writeToString(node);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...