如何将节点附加到java中的现有XML文件
public static void addALLToXML(Collection svr) throws IOException, ParserConfigurationException, TransformerException { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory .newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory .newDocumentBuilder(); Document document = documentBuilder.newDocument(); // Root Element Element rootElement = document.createElement("Servers"); document.appendChild(rootElement); for (Server i : svr) { // server elements Element server = document.createElement("server"); rootElement.appendChild(server); Element name = document.createElement("name"); name.appendChild(document.createTextNode(i.getName())); server.appendChild(name); Element port = document.createElement("port"); port.appendChild(document.createTextNode(Integer.toString(i.getPort()))); server.appendChild(port); } TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(document); StreamResult result = new StreamResult("/home/user/server.xml"); transformer.transform(source, result); }
这是我需要帮助的function:
public static void addNodeToXML(String nameIn, String portIn) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory .newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory .newDocumentBuilder(); /* parse existing file to DOM */ Document document = documentBuilder .parse(new File("/home/user/server.xml")); // Root Element Element rootElement = document.createElement("Servers"); document.appendChild(rootElement); // server elements Element server = document.createElement("server"); rootElement.appendChild(server); Element name = document.createElement("name"); name.appendChild(document.createTextNode(nameIn)); server.appendChild(name); Element port = document.createElement("port"); port.appendChild(document.createTextNode(portIn)); server.appendChild(port); }
原版的:
something port
通缉:
something port something port
以下完整示例将从当前目录中读取现有 server.xml
文件,附加新服务器并将该文件重新写入server.xml
。 没有现有的.xml文件它不起作用,因此您需要修改代码来处理这种情况。
import java.util.*; import javax.xml.transform.*; import javax.xml.transform.stream.*; import javax.xml.transform.dom.*; import org.w3c.dom.*; import javax.xml.parsers.*; public class AddXmlNode { public static void main(String[] args) throws Exception { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document document = documentBuilder.parse("server.xml"); Element root = document.getDocumentElement(); Collection servers = new ArrayList (); servers.add(new Server()); for (Server server : servers) { // server elements Element newServer = document.createElement("server"); Element name = document.createElement("name"); name.appendChild(document.createTextNode(server.getName())); newServer.appendChild(name); Element port = document.createElement("port"); port.appendChild(document.createTextNode(Integer.toString(server.getPort()))); newServer.appendChild(port); root.appendChild(newServer); } DOMSource source = new DOMSource(document); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); StreamResult result = new StreamResult("server.xml"); transformer.transform(source, result); } public static class Server { public String getName() { return "foo"; } public Integer getPort() { return 12345; } } }
示例server.xml文件:
something port
对代码的主要更改不是创建新的“根”元素。 上面的示例只使用现有server.xml
的当前根节点,然后只需附加一个新的Server元素并重写该文件。
要附加新数据元素,只需执行此操作…
Document doc = docBuilder.parse(is); Node root=doc.getFirstChild(); Element newserver=doc.createElement("new_server"); root.appendChild(newserver);
easy ….’is’是一个InputStream对象。 rest类似于你的代码….刚刚尝试过…
您可以将现有XML文件解析为DOM,并将新元素附加到DOM。 与您在创建全新XML时所做的非常相似。 我假设你不必担心重复的服务器。 如果您不必担心这一点,则必须通过DOM中的元素来检查重复项。
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); /* parse existing file to DOM */ Document document = documentBuilder.parse(new File("exisgint/xml/file")); Element root = document.getDocumentElement(); for (Server newServer : Collection bunchOfNewServers){ Element server = Document.createElement("server"); /* create and setup the server node...*/ root.appendChild(server); } /* use whatever method to output DOM to XML (for example, using transformer like you did).*/
如果需要在某个特定位置插入节点/元素,则可以执行后续步骤
- 将原始xml分为两部分
- 首先将您的新节点/元素作为子元素添加到第一个(第一部分应该在您想要添加元素之后以元素结束)
- 将第二部分附加到新文档。
它是简单的算法,但应该工作…
你可以使用DOM4j来做到这一点。