Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将节点附加到java中现有的XML文件中_Java_Xml - Fatal编程技术网

如何将节点附加到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分为两部分
  • 将新节点/元素作为子元素附加到first first(第一部分应以要添加元素的元素结尾)
  • 将第二部分附加到新文档中

  • 这是一个简单的算法,但应该可以工作…

    您可以这样做。

    您可以将现有的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);