Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/DOM:获取节点的XML内容_Java_Xml_Dom - Fatal编程技术网

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

Java/DOM:获取节点的XML内容,java,xml,dom,Java,Xml,Dom,我正在使用W3CDOM解析Java中的XML文件。 我陷入了一个特定的问题,我不知道如何获取节点的整个内部XML 节点如下所示: <td><b>this</b> is a <b>test</b></td> 这是一个测试 我必须使用什么函数才能获得: "<b>this</b> is a <b>test</b>" “这是一个测试”您必须使用转换/xslt API,将您的节点用作要转

我正在使用W3CDOM解析Java中的XML文件。 我陷入了一个特定的问题,我不知道如何获取节点的整个内部XML

节点如下所示:
<td><b>this</b> is a <b>test</b></td>
这是一个测试

我必须使用什么函数才能获得:
"<b>this</b> is a <b>test</b>"

“这是一个测试”

您必须使用转换/xslt API,将您的节点用作要转换的节点,并将结果放入新的StreamResult(new StringWriter());
. 见

呃。。。您也可以调用toString()并手动或使用regexp删除开始和结束标记

edit:toString()没有达到我预期的效果。拉出O'Reilly讨论了JavaDOM的加载和保存模块

特别是看那些看起来很有希望的。您可以调用writeToString(node)并切掉开头和结尾标记,就像我建议的那样,或者尝试使用不打印顶部节点标记(不确定这是否可行;我承认我以前从未使用过LSSerializer)

阅读O'Reilly的书似乎意味着做了如下事情:

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


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

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

DOMConfiguration=serializer.getDomConfig(); config.setParameter(“标准形式”,true)


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

我知道很久以前就有人问过这个问题,但对于下一个搜索者(今天是我),这对JDOM有效:

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

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

对此您有何看法? 我今天在android上也遇到了同样的问题,但我成功地制作了一个简单的“序列化程序”

私有字符串innerXml(节点){
字符串s=“”;
NodeList childs=node.getChildNodes();

对于我的td节点的(int i=0;iNo?.toString(),只会导致“[b:null]”嗯,我想我与Javascript+e4x混淆了。我的意思是调用只生成输出的函数,然后删除开始/结束标记。[关于SO的这篇文章可能有助于获取节点的内部Xml][1][1]:我说“非常感谢”!你帮我节省了做同样事情的时间。考虑到性能,这可能是最有效的方法。
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;
    }