●简介
dom4j和jdom都是用来解析xml的。
控制xml有四种api,sax,dom都比较底层,是java本身类库中就包含的操作方式。
·dom方式
dom=Document Object Model方式是把整个xml文件作为一个对象,放到内存中。
·sax方式 基于事件
5种事件
startDocument
endDocument
starElement
ednElement
character
simple API for XML 读一点解析一点 不读不解析不放入内存
在这基础之上开发了dom4j和jdom.
dom4j的性能好,hibernate用的是dom4j.
●用Dom4j解析xml
·建立XML User.hbm.xml
<hibernate-mapping>
<class name="com.bjsxt.User" talbe="t_user">
<property name="username"></property>
<property name="password"></property>
</class>
</hibernate-mapping>
·建立类文件 在main方法中读取xml。引入dom4j的包。
SAXReader reader = new SAXReader();
Document document = reader.read(new File("User.hbm.xml"));
//reader.read的参数还可以是一个文件流,这个文件可以通过当前类找到
//Class cls = 当前类.class;
//拿到当前类目录下的文件流中的文件流
//InputStream in = cls.getResourceAsStream("User.hbm.xml");
//Document document = reader.read(in);
//拿到路径cls.getResource("xxx.xml");返回一个bin目录下的地址以URL格式。用url.getPath();得到路径
Element rootElement = document.getRootElement();//拿到根元素 就是hibernate-mapping元素
rootElement.getName();拿到根元素的名字
//拿到第一个子节点 返回element
//rootElement.element("节点名");
//拿到第一个子节点的文本 返回string
//rootElement.elementText("节点名");
//遍历根元素的子元素
for(Iterator i = rootElement.elementIterator();i.hasNext();){
Element element = (Element)i.next();
System.out.println(element.getName());
}
//枚举名称为class的元素
for(Iterator i = root.elementiterator("class");i.hasNext();){
Element class = (Element)i.next();
System.out.println(class.getName());
//枚举属性
for(iterator i = class.attributeiterator(); i.hasNext();){
Attribute attribute = (Attribute)i.next();
System.out.println(attribute.getName());
}
}
//dom4j对XPath支持
//需要引入jar包,dom4j/lib/jaxen包
XPath就是在xml中找到特定节点的路径的语法
//documents.selectNodes(此处参考XPath文档 功能强大);
//Node n = documents.selectSingleNode("//user[@country='JP' and @pwd='123']");//词句可以选择名为user 属性conntry="JP" pwd='123'的所有的节点
List<Node> list = document.selectNodes("hibernate-mapping/class/property"); //把property节点全拿出来,作为一个装满node对象的list返回
for(Node n : list){
System.out.println(n.getName()); //读出节点
String name = n.valueOf(@name); //把n这个节点的名字叫name的属性的值取出来
}
●用Dom4j为xml添加内容并保存到xml
public static Document createDocument(){
Document document = DocumentHelper.createDocument(); //创建一个xml文件
Element root = document.addElement("hibernate-mapping");. //在文件中创建根节点名为hibernate-mapping
Element classElement = root.addElement("class") //在根节点中添加节点class
.addAttribute("name","com.bjsxt.User") //为class节点添加属性 name=com.bjsxt.User 如果有名为name的则修改此属性
.addAttribute("table","t_user"); //为class节点添加属性 table="t_user"
//element.setText();可以添加文本
classElement.addElement("property").addAttribute("name","username");
//FileWriter out = new FileWriter("User1.hbm.xml");
//document.write(out);//将xml文件输出到User1.hbm.xml
//out.flash();
//out.close();
//root.remove("classElement"); //删除root的一个名为classElement的子节点
OutputFormat format = OutputFormat.createPrettyPrint(); 创建格式
//document.setXMLEncoding("GB2312");//为输出的XML设置编码
//format.setEncoding("GB2312");//为格式化工具设置输出编码
//FileWriter总以本地字符(gbk)输出所以会出现乱码 建议用FileOutPutStream
XMLWriter writer = new XMLWriter(new FileWriter(User1.hbm.xml),format);创建格式输出的XMLWriter
writer.write(document);输出
writer.close();
return document;
}