我正在尝试将基础文档中的节点导入到新文档中,但是当我使用Document.importNode()方法时,它会生成异常.有趣的是,这个异常不包含消息,所以除了堆栈跟踪之外我几乎都是盲目的. (我是
java的新手)
这是我的方法,它将创建一个新文档并导入节点:
> this.Builder = DocumentBuilder
> this.Element =节点
码:
public XMLSelection extract () { if (this.Element != null) { try { Document newDoc = this.Builder.newDocument(); Node node = newDoc.importNode(this.Element,true); newDoc.appendChild(node); return new XMLSelection(newDoc); } catch(Exception e) { Debug.error("XMLSelection::extract",e); } } return null; }
堆栈跟踪:
02-06 14:27:53.328: W/System.err(9082): org.w3c.dom.DOMException 02-06 14:27:53.328: W/System.err(9082): at org.apache.harmony.xml.dom.NodeImpl.setNameNS(NodeImpl.java:227) 02-06 14:27:53.328: W/System.err(9082): at org.apache.harmony.xml.dom.ElementImpl.(ElementImpl.java:50) 02-06 14:27:53.328: W/System.err(9082): at org.apache.harmony.xml.dom.DocumentImpl.createElementNS(DocumentImpl.java:336) 02-06 14:27:53.328: W/System.err(9082): at org.apache.harmony.xml.dom.DocumentImpl.shallowCopy(DocumentImpl.java:156) 02-06 14:27:53.328: W/System.err(9082): at org.apache.harmony.xml.dom.DocumentImpl.cloneOrImportNode(DocumentImpl.java:208) 02-06 14:27:53.328: W/System.err(9082): at org.apache.harmony.xml.dom.DocumentImpl.importNode(DocumentImpl.java:222) 02-06 14:27:53.328: W/System.err(9082): at com.xxxx.xxxx.XMLSelection.extract(XMLSelection.java:57)
解决方法
尝试使用cloneNode,后跟adoptNode,以使用子元素作为新Document的根元素.
String xml = "<hello><world /></hello>"; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document0 = db.parse(new InputSource(new StringReader(xml))); Document document1 = db.newDocument(); NodeList nodeList = document0.getDocumentElement().getChildNodes(); document1.appendChild(document1.adoptNode(nodeList.item(0).cloneNode(true))); // Serialize the two documents to check that the copy was correct. ByteArrayOutputStream output = new ByteArrayOutputStream(); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(new DOMSource(document0),new StreamResult(output)); System.out.println(output.toString("UTF-8")); output.reset(); transformer.transform(new DOMSource(document1),new StreamResult(output)); System.out.println(output.toString("UTF-8")); } catch (TransformerException e) { } catch (IOException e) { } catch (SAXException e) { } catch (ParserConfigurationException e) { }