如何将节点附加到java中现有的XML文件中
原件:如何将节点附加到java中现有的XML文件中,java,xml,Java,Xml,原件: public static void addNodeToXML(String nameIn, String portIn) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory .newInstance(); Docume
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);
}
某物
港口
通缉:
<Servers>
<server>
<name>something</name>
<port>port</port>
</server>
</Servers>
某物
港口
某物
港口
如果需要在某个特定位置插入节点/元素,可以执行以下步骤
这是一个简单的算法,但应该可以工作…您可以这样做。您可以将现有的XML文件解析为DOM,并将新元素附加到DOM中。与创建全新的XML非常相似。我假设您不必担心重复服务器。如果您确实需要担心这一点,则必须遍历DOM中的元素以检查重复项
<Servers>
<server>
<name>something</name>
<port>port</port>
</server>
<server>
<name>something</name>
<port>port</port>
</server>
<Servers>
DocumentBuilderFactory DocumentBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder DocumentBuilder=documentBuilderFactory.newDocumentBuilder();
/*将现有文件解析为DOM*/
documentdocument=documentBuilder.parse(新文件(“exisgint/xml/File”);
元素根=document.getDocumentElement();
用于(服务器新闻服务器:集合新闻服务器){
元素服务器=Document.createElement(“服务器”);
/*创建并设置服务器节点*/
appendChild(服务器);
}
/*使用任何方法将DOM输出到XML(例如,像您那样使用transformer)*/
下面的完整示例将从当前目录中读取现有的服务器.xml文件,附加一个新服务器,然后将该文件重新写入服务器.xml
。如果没有现有的.xml文件,它将无法工作,因此需要修改代码来处理这种情况
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<Server> 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).*/
import java.util.*;
导入javax.xml.transform.*;
导入javax.xml.transform.stream.*;
导入javax.xml.transform.dom.*;
导入org.w3c.dom.*;
导入javax.xml.parsers.*;
公共类AddXmlNode{
公共静态void main(字符串[]args)引发异常{
DocumentBuilderFactory DocumentBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder DocumentBuilder=documentBuilderFactory.newDocumentBuilder();
documentdocument=documentBuilder.parse(“server.xml”);
元素根=document.getDocumentElement();
集合服务器=新的ArrayList();
添加(新服务器());
用于(服务器:服务器){
//服务器元素
Element newServer=document.createElement(“服务器”);
元素名称=document.createElement(“名称”);
name.appendChild(document.createTextNode(server.getName());
newServer.appendChild(名称);
元素端口=document.createElement(“端口”);
appendChild(document.createTextNode(Integer.toString(server.getPort()));
newServer.appendChild(端口);
appendChild(newServer);
}
DOMSource=新的DOMSource(文档);
TransformerFactory TransformerFactory=TransformerFactory.newInstance();
Transformer Transformer=transformerFactory.newTransformer();
StreamResult=newstreamresult(“server.xml”);
变换(源、结果);
}
公共静态类服务器{
公共字符串getName(){返回“foo”;}
公共整数getPort(){return 12345;}
}
}
示例server.xml文件:
某物
港口
对代码的主要更改不是创建新的“根”元素。上面的示例只使用现有
server.xml
中的当前根节点,然后只追加一个新的服务器元素并重新写入文件。要追加一个新的数据元素,只需执行以下操作
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Servers>
<server>
<name>something</name>
<port>port</port>
</server>
</Servers>
轻松……”is'是一个InputStream对象。rest与您的代码类似…刚刚尝试过…只能使用库的org.w3c.dom.*、javax.xml.*、org.xml.sax.*:(变量root和rootElement完全相同。有什么意义?是的,看起来像是一个错误。如果您愿意,请随时使用更正的代码进行更新。如果我有时间,我会自己更新它。@yb您是否注意到您正在执行
root.appendChild(新闻服务器)
在循环中两次?这是故意的吗?@alfasin我没有!可能是我在四月份的编辑引入了一个缺陷。我会调查并编辑。谢谢你让我知道:)
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<Server> servers = new ArrayList<Server>();
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; }
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Servers>
<server>
<name>something</name>
<port>port</port>
</server>
</Servers>
Document doc = docBuilder.parse(is);
Node root=doc.getFirstChild();
Element newserver=doc.createElement("new_server");
root.appendChild(newserver);