将新XML节点保存到文件

我正在尝试将包含XML nodeList节点保存为新文件,这里是获取新XML文档并拆分为较小XML的节点列表:

 public void split(Document inDocument) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); SaveXML savePerJob = new SaveXML(); // Load the input XML document, parse it and return an instance of the // Document class. Document document = inDocument; //all elements //jobs NodeList nodes = document.getDocumentElement().getChildNodes(); NodeList jobs = nodes.item(7).getChildNodes(); for(int j =0; j<jobs.getLength(); j++){ Node itm = jobs.item(j); String itmName = itm.getFirstChild().getNodeName(); String itmID = itm.getFirstChild().getTextContent(); System.out.println("name: " + itmName + " value: " + itmID); //here I want to save the node as a new .xml file } } 

输出是一个很长的列表,如:

 name: id value: 9496425 

现在我想将节点itm保存为新的.xml文件,但我没有找到按原样返回节点的函数。 谢谢。

您可以将节点转换为字符串,并将此字符串保存为.xml文件。

将节点转换为字符串

下面的方法将节点转换为xml字符串。 它只是一个JDK解决方案,不需要依赖项。

 import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import java.io.StringWriter; public static String toString(Node node, boolean omitXmlDeclaration, boolean prettyPrint) { if (node == null) { throw new IllegalArgumentException("node is null."); } try { // Remove unwanted whitespaces node.normalize(); XPath xpath = XPathFactory.newInstance().newXPath(); XPathExpression expr = xpath.compile("//text()[normalize-space()='']"); NodeList nodeList = (NodeList)expr.evaluate(node, XPathConstants.NODESET); for (int i = 0; i < nodeList.getLength(); ++i) { Node nd = nodeList.item(i); nd.getParentNode().removeChild(nd); } // Create and setup transformer Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); if (omitXmlDeclaration == true) { transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); } if (prettyPrint == true) { transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); } // Turn the node into a string StringWriter writer = new StringWriter(); transformer.transform(new DOMSource(node), new StreamResult(writer)); return writer.toString(); } catch (TransformerException e) { throw new RuntimeException(e); } catch (XPathExpressionException e) { throw new RuntimeException(e); } } 

这是一种可能性:

 void save(Node node, OutputStream stream) throws Exception { DOMImplementationLS ls = (DOMImplementationLS) node.getOwnerDocument().getImplementation(); LSOutput out = ls.createLSOutput(); out.setByteStream(stream); LSSerializer ser = ls.createLSSerializer(); ser.write(node, out); } 

也许你应该确保node确实是一个Element ,但我把它留作了一个excersize。