packagecom.siwuxie095.xml;
importjava.io.File;
importjava.io.StringWriter;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importjavax.xml.transform.Transformer;
importjavax.xml.transform.TransformerConfigurationException;
importjavax.xml.transform.TransformerException;
importjavax.xml.transform.TransformerFactory;
importjavax.xml.transform.dom.DOMSource;
importjavax.xml.transform.stream.StreamResult;
importorg.w3c.dom.Document;
importorg.w3c.dom.Element;
public classCreateXML {
/**
*使用Java语言实现创建XML数据和输出XML数据
* DOM方式操作和生成XML数据
*
* @param args
*/
public staticvoidmain(String[] args) {
//创建一个新的DocumentBuilderFactory,
//使用静态方法调用newInstance()方法,创建一个新的实例
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try{
//创建一个DocumentBuilder
//有异常抛出,用try catch捕获
DocumentBuilder builder=factory.newDocumentBuilder();
//创建一个全新的XML文档:Document
//(注意:使用org.w3c.dom包中的Document类)
Document document=builder.newDocument();
//先添加一个根元素:root,并指定标签:languages
Element root=document.createElement("languages");
//设置根元素的属性,键值对
root.setAttribute("category", "it");
Element lan1=document.createElement("lan");
lan1.setAttribute("id", "1");
Element name1=document.createElement("name");
name1.setTextContent("Java");
Element ide1=document.createElement("ide");
ide1.setTextContent("Eclipse");
Element lan2=document.createElement("lan");
lan2.setAttribute("id", "2");
Element name2=document.createElement("name");
name2.setTextContent("Swift");
Element ide2=document.createElement("ide");
ide2.setTextContent("Xcode");
Element lan3=document.createElement("lan");
lan3.setAttribute("id", "3");
Element name3=document.createElement("name");
name3.setTextContent("C#");
Element ide3=document.createElement("ide");
ide3.setTextContent("Visual Studio");
//元素创建完毕后,将name元素和ide元素添加到lan元素中
//使之成为lan元素的子节点
//传入的是Node类型,而Element是继承自Node的,所以可以传入
lan1.appendChild(name1);
lan1.appendChild(ide1);
lan2.appendChild(name2);
lan2.appendChild(ide2);
lan3.appendChild(name3);
lan3.appendChild(ide3);
//同理:将lan添加到root中
root.appendChild(lan1);
root.appendChild(lan2);
root.appendChild(lan3);
//最后,将root添加到document中,
//实现XML数据的节点一层一层包装,最终包装到root和document中
document.appendChild(root);
//-----------------------------------------------------------------
//XML数据准备完成,将当前创建好的XML数据,通过网络以字符串的形式传递
//(关键是:怎么将XML数据转换成字符串)
//创建一个TransformerFactory,同样通过静态方法调用类的newInstance()方法
//获取一个新的实例
TransformerFactory transformerFactory=TransformerFactory.newInstance();
//创建一个Transformer,可以将XML文档转换成其他格式
//有异常抛出,用try catch捕获
Transformer transformer=transformerFactory.newTransformer();
//调用Transformer的transform()方法,传入的参数类型很奇怪
//第一个参数(输入值)是Source类型,第二个参数(输出值)是Result类型
//第一个参数(输入值)是固定的,由于Source是通过document来创建的,
//传入匿名对象new DOMSource(),DOMSource()的参数是Node类型,
//而Document也是继承自Node,所以可以传入document,将XML文档作为转换的源
//
//第二个参数(输出值)可以有2种方法,
//第一个可以转换为字符串,第二个可以转换为文件
//传入匿名对象new StreamResult(),支持File输出一个文件,也支持Writer写出
//如果想让XML数据通过网络传播,需要转换成字符串,这就需要传入Writer
//先创建一个StringWriter
//有异常抛出,用try catch捕获
StringWriter writer=newStringWriter();
transformer.transform(newDOMSource(document), newStreamResult(writer));
//最后将StringWriter转换为字符串
//输出只有一行,是纯粹的XML内容,丢失了换行符、缩进符
System.out.println(writer.toString());
//转换成文件,第二个参数的参数传入文件对象
transformer.transform(newDOMSource(document),
newStreamResult(newFile("languages.xml")));
} catch(ParserConfigurationException e) {
e.printStackTrace();
} catch(TransformerConfigurationException e) {
e.printStackTrace();
} catch(TransformerException e) {
e.printStackTrace();
}
}
}