Java生成XML文件与XML文件的写入

既然能在代码中解析XML文档获取数据,当然也能通过代码动态生成XML文档了。

与解析XML一样,生成XML文档也是用到了那4种方法。



一:DOM方法生成XML

步骤:

1:创建DocumentBuilder:DocumentBuilder builder=new DocumentBuilder();

2:创建dom对象:Document dom=builder.newDocument();

3:创建dom中元素:Element element=dom.createElement("元素名");

4:向元素添加子节点:element.appendChild(childElement);(dom树就是通过不停appendChild形成的)

5:向元素设置属性:element.setAttribute("属性名","属性值");

6:向元素添加文本内容:element.setTextContent("标签间内容");

7:把根元素添加至dom中:dom.appendChild(rootElement);(由于子节点都是添加到根结点下的,所以把根结点添加到dom就相当于把整棵标签树添加进dom了)

8:把dom对象导出到xml文件:

  1)创建转换器工厂:TransformerFactory  factory=TransformerFactory.newInstance();

  2)由工厂创建转换器实例:Transformer transformer=factory.newTransformer();

  3)设置转换格式:transformer.setOutputProperty(属性,属性值);//设置输出到文档时的格式,比如:换行等

  4)由转换器把dom资源转换到结果输出流,而结果输出流连接到一个xml文件:transformer.transform(new DOMSourse(dom),new StreamResult(xml_file));



二:SAX方法操作XML

步骤:

1:创建SAX转换器工厂:SAXTransformerFactory  factory=SAXTransformerFactory.newInstance();

2:创建转换handler:TransformerHandler handler=factory.newTransformerHandler();

3:由handler创建转换器:Transformer transformer=handler.getTransformer();

4:设置转换格式:transformer.setOutputProperty(属性,属性值);//设置输出到文档时的格式,比如:换行等

5:创建Result连接到xml文件:Result res=new StreamResult(new FileOutputStream(xml_file));

6:关联result到handler:handler.setResult(res);

7:利用handler操作xml文件:

 1)打开dom对象:handler.startDocument();

 2)创建元素:handler.startElement(uri,命名空间,元素名,属性列表);//没有则填null

 3)创建子结点:handler.startElement(uri,命名空间,子元素名,属性列表);//在一个start与end的元素之间添加的结点就是它的子节点

 4)为结点添加属性:上面start的元素名 element.setAttribute("","","属性名","属性值");

 5)为结点添加文本内容:在一个element的start与end之间,handler.characters(byte[],start,length);//byte就是文本内容,后面可以进行截取

 5)镜像结束元素:hanlder.endElement("","",元素名);//前面有start,操作完这个结点后切记要end,添加镜像结束标签。

 6)关闭dom对象:handler.endDocument();

原理:通过result关联到xml文档,通过handler开始一个标签、设置标签属性、添加文本、结束一个标签方法操作result从而改变xml文档内容。



三:JDOM方法生成XML

步骤:创建根结点,由根结点创建dom对象,然后从根结点开始构造dom树,最后输出dom对象到xml文档即可。

1:生成根节点:Element root=new Element(“节点名”);

2:设置根结点属性:root.setAttribute(属性名,属性值);

3:把根作为参数创建dom对象:Document dom=new Document(root);

4:从根结点开始构造dom树:

1)创建结点:Element element=new Element("节点名");

2)设置结点属性:element.setAttribute(属性名,属性值);

3)设置结点文本内容:element.setText(文本内容);

4)添加结点到父节点下:father.addContent(child);

5:dom树构造完毕,进行输出:

1)创建XMLOutputer:XMLOutputer outputer=new XMLOutputer(format);//format参数可选,可以创建一个format对象设置输出格式,比如换行、编码格式等

2)通过outputer把dom对象输出到xml文档:outputer.output(dom,new FileOutputStream(xml_file));



四:DOM4j生成XML

步骤:

1:创建dom对象:Document dom=new Document();

2:创建根节点:Element rooe=dom.addElement("根节点名");

3:为根结点设置属性:element.setAttribute(属性名,属性值);

4:由根结点构建dom树:

1)创建子节点:Element element=father.addElement("节点名");

2)设置结点属性:element.setAttribute(属性名,属性值);

3)设置结点文本内容:element.setText(文本);

5:构建dom树完毕,把dom对象输出到xml文件:

1)创建XMLWriter:XMLWriter writer=new XMLWriter(new FileOutputStream(xml_file),format);//format参数可选,可以传一个format对象指定输出格式

2)设置输出到文档时是否转义:writer.setEscapeText(false);//true转义

3)通过writer把dom对象写到xml文档中:wtiter.write(dom);
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用DOM或者SAX来生成XML文件,下面分别介绍使用这两种方式生成XML文件的方法。 1. 使用DOM生成XML文件 DOM方式是将整个XML文件读入内存中,然后以树形结构进行操作。下面是使用DOM方式生成XML文件的示例代码: ```java 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 GenerateXML { public static void main(String[] args) { try { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); // 创建根节点 Document doc = docBuilder.newDocument(); Element rootElement = doc.createElement("employees"); doc.appendChild(rootElement); // 创建子节点 Element employee = doc.createElement("employee"); rootElement.appendChild(employee); // 设置子节点属性 employee.setAttribute("id", "1"); // 创建子节点 Element firstName = doc.createElement("firstName"); firstName.appendChild(doc.createTextNode("John")); employee.appendChild(firstName); // 创建子节点 Element lastName = doc.createElement("lastName"); lastName.appendChild(doc.createTextNode("Doe")); employee.appendChild(lastName); // 创建子节点 Element age = doc.createElement("age"); age.appendChild(doc.createTextNode("30")); employee.appendChild(age); // 创建子节点 Element gender = doc.createElement("gender"); gender.appendChild(doc.createTextNode("Male")); employee.appendChild(gender); // 创建TransformerFactory对象 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); // 将XML文件写入磁盘 StreamResult result = new StreamResult(new File("employees.xml")); transformer.transform(source, result); System.out.println("XML文件生成成功!"); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } } ``` 运行该程序后,会在当前目录下生成一个名为employees.xmlXML文件,内容如下: ```xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <employees> <employee id="1"> <firstName>John</firstName> <lastName>Doe</lastName> <age>30</age> <gender>Male</gender> </employee> </employees> ``` 2. 使用SAX生成XML文件 SAX方式是一种基于事件驱动的XML解析方式,它不需要将整个XML文件读入内存中,而是在解析XML文件时逐个读取XML元素,以达到节省内存的目的。下面是使用SAX方式生成XML文件的示例代码: ```java import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class GenerateXML { public static void main(String[] args) { try { // 创建一个SAXParserFactory实例 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); // 创建一个DefaultHandler实例 DefaultHandler handler = new DefaultHandler() { boolean bFirstName = false; boolean bLastName = false; boolean bAge = false; boolean bGender = false; // 开始解析XML元素时调用该方法 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("employee")) { System.out.println("开始解析员工信息"); } else if (qName.equalsIgnoreCase("firstName")) { bFirstName = true; } else if (qName.equalsIgnoreCase("lastName")) { bLastName = true; } else if (qName.equalsIgnoreCase("age")) { bAge = true; } else if (qName.equalsIgnoreCase("gender")) { bGender = true; } } // 解析XML元素时获取元素内容时调用该方法 public void characters(char ch[], int start, int length) throws SAXException { if (bFirstName) { System.out.println("员工名:" + new String(ch, start, length)); bFirstName = false; } else if (bLastName) { System.out.println("员工姓:" + new String(ch, start, length)); bLastName = false; } else if (bAge) { System.out.println("员工年龄:" + new String(ch, start, length)); bAge = false; } else if (bGender) { System.out.println("员工性别:" + new String(ch, start, length)); bGender = false; } } // 结束解析XML元素时调用该方法 public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("employee")) { System.out.println("结束解析员工信息"); } } }; // 开始解析XML文件 saxParser.parse(new File("employees.xml"), handler); // 将XML文件写入磁盘 FileWriter writer = new FileWriter("employees2.xml"); writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"); writer.write("<employees>\n"); writer.write("<employee>\n"); writer.write("<firstName>John</firstName>\n"); writer.write("<lastName>Doe</lastName>\n"); writer.write("<age>30</age>\n"); writer.write("<gender>Male</gender>\n"); writer.write("</employee>\n"); writer.write("</employees>\n"); writer.close(); System.out.println("XML文件生成成功!"); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } ``` 运行该程序后,会在当前目录下生成一个名为employees2.xmlXML文件,内容如下: ```xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <employees> <employee> <firstName>John</firstName> <lastName>Doe</lastName> <age>30</age> <gender>Male</gender> </employee> </employees> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值