java语言本身支持DOM,可以直接查找属性与 子节点,过程大致如下:
1、通过工厂类创建对象,可以通过该对象创建文本对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
2.通过工厂类的对象(dbf )创建文档对象,该对象可以映射操作xml文件
DocumentBuilder docum = dbf.newDocumentBuilder();
Document doc = docum.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("MyXML/Student.xml"));
3.获取文档中的所有节点,实现后面的对属性、值得获取
NodeList nodelist = doc.getElementsByTagName("student");//这里的“student”为要获取节点的名称,返回的是节点的集合
4.遍历每个节点,获取节点的属性和节点的子节点,实现对应的操作。
例子:
先定义个一个xml文件:
<?xml version="1.0" encoding="UTF-8"?> <students> <student score="23"> <name>"张三"</name> <id>1003</id> <sex>女</sex> </student> <student score="24"> <name>"李四"</name> <id>1004</id> <sex>男</sex> </student> <student id="1005"> <name>"张五"</name> <score>25</score> <sex>男</sex> </student> </students>
再定义一个Students类
public class Students { private int id; private int socre; private String name; private String sex; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getSocre() { return socre; } public void setSocre(int socre) { this.socre = socre; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Students [id=" + id + ", socre=" + socre + ", name=" + name + ", sex=" + sex + "]"; } }
最后进行XML解析
import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; //dom解析 public class DomParse { public static void main(String[] args) throws Exception { //使用工厂类创建对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //使用工厂类的对象创建文档对象,该对象映射操作xml文件 DocumentBuilder docum = dbf.newDocumentBuilder(); Document doc = docum.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("MyXML/Student.xml")); //获取文档中所有的student节点,返回的是节点的集合 NodeList nodelist = doc.getElementsByTagName("student"); //定义List集合以便存储Srudents对象 List<Students>list = new ArrayList<Students>(); for(int i=0;i<nodelist.getLength();i++) { //新建Student对象以便存储XML文件信息 Students stu = new Students(); //使用item()遍历每个节点 Node it = nodelist.item(i); //获取节点的属性,返回的是属性的集合 NamedNodeMap att = it.getAttributes(); //遍历每一个属性,如果与Student的属性相对应,则在stu中存入对应属性的值 for(int j = 0;j<att.getLength();j++) { Node property = att.item(j); //getNodeName()获取属性的名称 if("id".equals(property.getNodeName())) { //getTextContent()获取属性对应的名字 stu.setId(Integer.parseInt(property.getTextContent())); } if("sex".equals(property.getNodeName())) { stu.setSex(property.getTextContent()); } if("score".equals(property.getNodeName())) { stu.setSocre(Integer.parseInt(property.getTextContent())); } if("name".equals(property.getNodeName())) { stu.setName((property.getTextContent())); } } //获取节点的子节点,返回子节点的集合。 NodeList childNodes = it.getChildNodes(); //遍历子节点,如果与该节点名称与Student的属性相对应,则在stu中存入对应的值 for(int k=0;k<childNodes.getLength();k++) { Node item = childNodes.item(k); if("id".equals(item.getNodeName())) { stu.setId(Integer.parseInt(item.getTextContent())); } if("sex".equals(item.getNodeName())) { stu.setSex(item.getTextContent()); } if("score".equals(item.getNodeName())) { stu.setSocre(Integer.parseInt(item.getTextContent())); } if("name".equals(item.getNodeName())) { stu.setName((item.getTextContent())); } } //向集合中添加该对象 list.add(stu); } //遍历集合输出测试 for(Students s:list) { System.out.println(s); } } }
运行结果
总结:
优点: ①易于使用
②丰富的API集合,可用于轻松地导航
③整棵树加载到内存,允许对XML文档进行随机访问
缺点:①整个XML文档必须一次解析完
②将整棵树加载到内存成本较高
③一般的DOM节点对于必须为所有节点创建对象的对象类型绑定不太理想
最适合于:需要修改XML文档的应用程序或XSLT应用程序(不可用于只读XML的应用程序)