Java / DOM:获取节点的XML内容

时间:2009-01-27 20:04:06

标签: java xml dom

我使用W3C DOM在Java中解析XML文件。 我陷入了一个特定的问题,我无法弄清楚如何获得一个节点的整个内部XML。

节点看起来像这样:     

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

我必须使用什么功能才能获得:     

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

6 个答案:

答案 0 :(得分:4)

我知道这很久以前就被问到了,但是对于下一个搜索的人(今天是我),这适用于JDOM:

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

这将所有子节点的列表传递给outputString,它将按顺序将它们序列化。

答案 1 :(得分:3)

您必须使用&lt; b&gt;使用transform / xslt API。 node作为要转换的节点,并将结果放入新的StreamResult(new StringWriter()); 。见 how-to-pretty-print-xml-from-java

答案 2 :(得分:2)

你对此怎么说? 我今天在android上遇到了同样的问题,但我设法做了简单的“serializator”

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

答案 3 :(得分:0)

呃......你也可以调用toString(),只需手动或使用正则表达式来切断开始和结束标记。

编辑:toString()不能达到我的预期。拉出O'Reilly Java & XML book关于Java DOM的加载和保存模块的讨论。

特别参见看起来非常有希望的LSSerializer。您可以调用writeToString(node)并按照我的建议切断开始和结束标记,或尝试使用LSSerializerFilter不打印顶级节点标记(不确定这是否有用;我承认我已经之前从未使用过LSSerializer。)

阅读O'Reilly的书似乎表明做了这样的事情:

 DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
 DOMImplementationLS lsImpl = 
   (DOMImplementationLS)registry.getDOMImplementation("LS");
 LSSerializer serializer = lsImpl.createLSSerializer();
 String nodeString = serializer.writeToString(node);

答案 4 :(得分:0)

node.getTextContent();

你应该使用Dom4J的JDom来处理节点,如果没有其他原因,可以正确处理空白。

答案 5 :(得分:0)

要删除不必要的标签,可能会使用以下代码:

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

但它并不总是有效,因为“canonical-form = true”是可选的