【问题标题】:Create XML file using java使用 java 创建 XML 文件
【发布时间】:2011-05-07 17:20:42
【问题描述】:

如何使用java创建一个xml文件并将其保存在我的机器中的某个位置。xml文件中还包含属性?我找到了 org.w3c.dom.Document,但在为元素创建属性和保存 xml 文件时遇到问题。

谢谢。

【问题讨论】:

    标签: java xml


    【解决方案1】:

    您可以使用 DOM XML 解析器通过 Java 创建 XML 文件。一个很好的例子可以找到on this site:

    try {
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
    
        //root elements
        Document doc = docBuilder.newDocument();
    
        Element rootElement = doc.createElement("company");
        doc.appendChild(rootElement);
    
        //staff elements
        Element staff = doc.createElement("Staff");
        rootElement.appendChild(staff);
    
        //set attribute to staff element
        Attr attr = doc.createAttribute("id");
        attr.setValue("1");
        staff.setAttributeNode(attr);
    
        //shorten way
        //staff.setAttribute("id", "1");
    
        //firstname elements
        Element firstname = doc.createElement("firstname");
        firstname.appendChild(doc.createTextNode("yong"));
        staff.appendChild(firstname);
    
        //lastname elements
        Element lastname = doc.createElement("lastname");
        lastname.appendChild(doc.createTextNode("mook kim"));
        staff.appendChild(lastname);
    
        //nickname elements
        Element nickname = doc.createElement("nickname");
        nickname.appendChild(doc.createTextNode("mkyong"));
        staff.appendChild(nickname);
    
        //salary elements
        Element salary = doc.createElement("salary");
        salary.appendChild(doc.createTextNode("100000"));
        staff.appendChild(salary);
    
        //write the content into xml file
        TransformerFactory transformerFactory =  TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
    
        StreamResult result =  new StreamResult(new File("C:\\testing.xml"));
        transformer.transform(source, result);
    
        System.out.println("Done");
    
    }catch(ParserConfigurationException pce){
        pce.printStackTrace();
    }catch(TransformerException tfe){
        tfe.printStackTrace();
    }
    

    【讨论】:

    • xml String 是什么样的?请在代码前加上。
    • -1 表示不承认来源,这意味着它是原始材料
    • 我认为 todofixthis 的“漂亮代码”评论是讽刺,这是 Java 的标准 XML API 等等,所以我赞成。 :)
    • 此处提供了带有解释的答案。 stackoverflow.com/a/50148098/9339242
    【解决方案2】:

    您可以使用Xembly,这是一个小型开源库,可以让这个 XML 创建过程更加直观:

    String xml = new Xembler(
      new Directives()
        .add("root")
        .add("order")
        .attr("id", "553")
        .set("$140.00")
    ).xml();
    

    Xembly 是原生 Java DOM 的包装器,是一个非常轻量级的库。

    【讨论】:

    • @DanielAbouChleih,我在 4 年后来到这里,发现这个答案很有用。
    【解决方案3】:

    看看dom4jjdom。这两个库都允许创建文档并允许将文档打印为 xml。两者都被广泛使用,非常易于使用,您会发现很多示例和 sn-ps。

    dom4j - Quick start guide

    【讨论】:

      【解决方案4】:

      刚好也在这方面工作,使用此处的示例https://www.tutorialspoint.com/java_xml/java_dom_create_document.htm,并阅读说明。我也给你提供我自己的例子:

      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
              DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
              Document doc = dBuilder.newDocument();
              // root element
      
      
      Element rootElement = doc.createElement("words");
                  doc.appendChild(rootElement);
      while (ptbt.hasNext()) {
                      CoreLabel label = ptbt.next();
                      System.out.println(label);
      
                      m = r1.matcher(label.toString());
                      //System.out.println(m.find());
                      if (m.find() == true) {
                          Element w = doc.createElement("word");                  
                          w.appendChild(doc.createTextNode(label.toString()));
                          rootElement.appendChild(w);
                      }
      
      TransformerFactory transformerFactory = TransformerFactory.newInstance();
              Transformer transformer = transformerFactory.newTransformer();
              DOMSource source = new DOMSource(doc);
              StreamResult result = new StreamResult(new File("C:\\Users\\workspace\\Tokenizer\\tokens.xml"));
              transformer.transform(source, result);
              // Output to console for testing
              StreamResult consoleResult = new StreamResult(System.out);
              transformer.transform(source, consoleResult);
      

      这是在使用斯坦福自然语言处理的分词器的背景下,只是其中的一部分,以了解如何添加元素。 输出为:Billbuyedapples(我从文件中读取了这句话)

      【讨论】:

        【解决方案5】:

        您可能想试一试XStream,这并不复杂。它基本上完成了繁重的工作。

        【讨论】:

        • 此 URL 需要用户名/密码。
        • @james.garriss:链接已修改。
        • “XStream 是一个简单的库,用于将对象序列化为 XML 并再次返回。”
        【解决方案6】:

        我正在提供我自己的blog 的答案。希望这会有所帮助。

        会输出什么?

        将创建以下名为 users.xml 的 XML 文件。

        <?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
        <users>
            <user uid="1">
                <firstname>Interview</firstname>
                <lastname>Bubble</lastname>
                <email>admin@interviewBubble.com</email>
            </user>
        </users>
        

        程序

        使用 DOM 解析器创建 XML 文件的基本步骤是:

        1. 创建一个DocumentBuilder 实例。

        2. 从上面的DocumentBuilder创建一个文档。

        3. 使用Element 类及其appendChild 方法创建您想要的元素。

        4. 创建一个新的Transformer 实例和一个新的DOMSource 实例。

        5. 为您要使用的输出流创建一个新的StreamResult

        6. 使用transform方法将DOM对象写入输出流。

        源代码:

        package com.example.TestApp;
        
        import java.io.File;
        import java.io.IOException;
        import javax.xml.parsers.DocumentBuilder;
        import javax.xml.parsers.DocumentBuilderFactory;
        import javax.xml.parsers.ParserConfigurationException;
        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 org.w3c.dom.Document;
        import org.w3c.dom.Element;
        
        public class CreateXMLFileJava {
        
         public static void main(String[] args) throws ParserConfigurationException, 
                                                       IOException, 
                                                       TransformerException
            {
             // 1.Create a DocumentBuilder instance
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dbuilder = dbFactory.newDocumentBuilder();
        
            // 2. Create a Document from the above DocumentBuilder.
            Document document = dbuilder.newDocument();
        
            // 3. Create the elements you want using the Element class and its appendChild method.   
        
           // root element
            Element users = document.createElement("users");
            document.appendChild(users);   
        
            // child element
            Element user = document.createElement("user");
            users.appendChild(user);  
        
            // Attribute of child element
            user.setAttribute("uid", "1");   
        
            // firstname Element
            Element firstName = document.createElement("firstName");
            firstName.appendChild(document.createTextNode("Interview"));
            user.appendChild(firstName);   
        
            // lastName element
            Element lastName = document.createElement("lastName");
            lastName.appendChild(document.createTextNode("Bubble"));
            user.appendChild(lastName);   
        
            // email element
            Element email = document.createElement("email");
            email.appendChild(document.createTextNode("admin@interviewBubble.com"));
            user.appendChild(email);   
        
            // write content into xml file   
        
            // 4. Create a new Transformer instance and a new DOMSource instance.
           TransformerFactory transformerFactory = TransformerFactory.newInstance();
           Transformer transformer = transformerFactory.newTransformer();
           DOMSource source = new DOMSource(document);
        
           // 5. Create a new StreamResult to the output stream you want to use.
           StreamResult result = new StreamResult(new File("/Users/admin/Desktop/users.xml"));
           // StreamResult result = new StreamResult(System.out); // to print on console
        
           // 6. Use transform method to write the DOM object to the output stream.
           transformer.transform(source, result);  
        
           System.out.println("File created successfully");
         }
        }
        

        输出:

        <?xml version="1.0" encoding="UTF-8" standalone="no"?>
        <users>
          <user uid="1">
             <firstName>Interview</firstName>
             <lastName>Bubble</lastName>
             <email>admin@interviewBubble.com</email>
          </user>
        </users>
        

        【讨论】:

        • so,在哪里设置encoding="UTF-8"
        【解决方案7】:

        我喜欢 Xembly 语法,但它不是静态类型的 API。你可以通过XMLBeam得到这个:

        // Declare a projection
        public interface Projection {
        
            @XBWrite("/root/order/@id")
            Projection setID(int id);
        
            @XBWrite("/root/order")
            Projection setValue(String value);
        }
        
        public static void main(String[] args) {
            // create a projector
            XBProjector projector = new XBProjector();
        
            // use it to create a projection instance
            Projection projection = projector.projectEmptyDocument(Projection.class);
        
            // You get a fluent API, with java types in parameters 
            projection.setID(553).setValue("$140.00");
        
            // Use the projector again to do IO stuff or create an XML-string
            projector.toXMLString(projection);
        }
        

        我的经验是,即使 XML 变得更复杂,它也能很好地工作。您可以将 XML 结构与您的 java 代码结构分离。

        【讨论】:

          【解决方案8】:
          package com.server;
          
          import java.io.*;
          
          import javax.servlet.*;
          import javax.servlet.http.*;
          
          import java.io.*;
          import java.sql.Connection;
          import java.sql.Date;
          import java.sql.DriverManager;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.sql.Statement;
          import java.util.ArrayList;
          
          
          import org.w3c.dom.*;
          
          import com.gwtext.client.data.XmlReader;
          
          import javax.xml.parsers.*;
          import javax.xml.transform.*;
          import javax.xml.transform.dom.*;
          import javax.xml.transform.stream.*;  
          
          public class XmlServlet extends HttpServlet
          { 
          
            NodeList list;
            Connection con=null;
            Statement st=null;
            ResultSet rs = null;
            String xmlString ;
            BufferedWriter bw;
            String displayTo;
            String displayFrom;
            String addressto;
            String addressFrom;
            Date send;
            String Subject;
            String body;
            String category;
            Document doc1;
            public void doGet(HttpServletRequest request,HttpServletResponse response)
             throws ServletException,IOException{
          
              System.out.print("on server");  
          
            response.setContentType("text/html");
            PrintWriter pw = response.getWriter();
            System.out.print("on server");
            try
            {
          
          
              DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
              DocumentBuilder docBuilder = builderFactory.newDocumentBuilder();
              //creating a new instance of a DOM to build a DOM tree.
              doc1 = docBuilder.newDocument();
              new XmlServlet().createXmlTree(doc1);
          
              System.out.print("on server");
          
            }
            catch(Exception e)
            {
            System.out.println(e.toString());
            }
          
             }
          
            public void createXmlTree(Document doc) throws Exception {
            //This method creates an element node
          
              System.out.println("ruchipaliwal111");
          
              try
              {
          
                System.out.println("ruchi111");
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost:3308/plz","root","root1");
                st = con.createStatement();
          
                rs = st.executeQuery("select * from data");
          
          
                Element root = doc.createElement("message");
                doc.appendChild(root);
          
                  while(rs.next())
                  {
          
          
          
                 displayTo=rs.getString(1).toString();
                 System.out.println(displayTo+"getdataname");
          
                 displayFrom=rs.getString(2).toString();
                 System.out.println(displayFrom +"getdataname");
          
                   addressto=rs.getString(3).toString();
                   System.out.println(addressto +"getdataname");
          
                 addressFrom=rs.getString(4).toString();
                 System.out.println(addressFrom +"getdataname");
          
                 send=rs.getDate(5);
                 System.out.println(send +"getdataname");
          
                 Subject=rs.getString(6).toString();
                 System.out.println(Subject +"getdataname");
          
                 body=rs.getString(7).toString();
                 System.out.println(body+"getdataname");
          
                category=rs.getString(8).toString();
                 System.out.println(category +"getdataname");
          
          
                 //adding a node after the last child node of ssthe specified node.
          
          
                  Element element1 = doc.createElement("Header");
                  root.appendChild(element1);
          
          
                  Element child1 = doc.createElement("To");
                  element1.appendChild(child1);
          
                  child1.setAttribute("displayNameTo",displayTo);
                  child1.setAttribute("addressTo",addressto);
          
                  Element child2 = doc.createElement("From");
                  element1.appendChild(child2);
          
                  child2.setAttribute("displayNameFrom",displayFrom);
                  child2.setAttribute("addressFrom",addressFrom);
          
                  Element child3 = doc.createElement("Send");
                  element1.appendChild(child3);
          
                  Text text2 = doc.createTextNode(send.toString());
                  child3.appendChild(text2);
          
                  Element child4 = doc.createElement("Subject");
                  element1.appendChild(child4);
          
                  Text text3 = doc.createTextNode(Subject);
                  child4.appendChild(text3);
          
                  Element child5 = doc.createElement("category");
                  element1.appendChild(child5);
          
                  Text text44 = doc.createTextNode(category);
                  child5.appendChild(text44);
          
          
                  Element element2 = doc.createElement("Body");
                  root.appendChild(element2);
          
                  Text text1 = doc.createTextNode(body);
                  element2.appendChild(text1);
          
                 /*
                  Element child1 = doc.createElement("name");
                  root.appendChild(child1);
                  Text text = doc.createTextNode(getdataname);
                  child1.appendChild(text);
                  Element element = doc.createElement("address");
                  root.appendChild(element);
                  Text text1 = doc.createTextNode( getdataaddress);
                  element.appendChild(text1); 
               */
                } 
          
          
          
          
          
          
          //TransformerFactory instance is used to create Transformer objects. 
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();
          
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(OutputKeys.METHOD,"xml");
            // transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
          
          
            // create string from xml tree
            StringWriter sw = new StringWriter();
            StreamResult result = new StreamResult(sw);
            DOMSource source = new DOMSource(doc);
            transformer.transform(source, result);
          
            xmlString = sw.toString();
          
          
            File file = new File("./war/ds/newxml.xml");
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
            bw.write(xmlString);
             }
          
              catch(Exception e)
              {
                System.out.print("after while loop exception"+e.toString());
              }
          
            bw.flush();
            bw.close();
            System.out.println("successfully done.....");
            }
          }
          

          【讨论】:

          • SQL 跟这个有什么关系??
          • Servlet 到底跟这个有什么关系?
          猜你喜欢
          • 2012-10-05
          • 1970-01-01
          • 2018-07-29
          • 2016-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多