[英]Save new XML node to file
我试图挽救nodeList
包含节点XML
作为一个新的文件,这里是得到一个新的节点列表XML
文档和拆分为较小XMLs
:
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.