我使用W3C DOM在Java中解析XML文件。 我陷入了一个特定的问题,我无法弄清楚如何获得一个节点的整个内部XML。
节点看起来像这样:
<td><b>this</b> is a <b>test</b></td>
我必须使用什么功能才能获得:
"<b>this</b> is a <b>test</b>"
答案 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”是可选的