public List<Person> getPersons(InputStream inStream) throws Exception{ List<Person> persons = new ArrayList<Person>(); //得到DocumentBuilder对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); /* * 使用DocumentBuilder对象方法对文件进行解析 * 传入的参数是XML文件的内容 * 调用完该方法已经完成对XML文件的解析。 */ Document document = builder.parse(inStream); /* * 下面的操作都是从内存中检索数据(文档树) */ //第一步:取得根元素 Element root = document.getDocumentElement(); //得到节点集合 NodeList personNodes = root.getElementsByTagName("person"); //迭代从节点列表中取得元素 for(int i = 0 ; i < personNodes.getLength() ; i++){ Person person = new Person(); //得到person节点对象 Element personElement = (Element)personNodes.item(i); //取得节点属性值 person.setId(new Integer(personElement.getAttribute("id"))); //取得节点的子节点 NodeList personChilds = personElement.getChildNodes(); for(int j = 0 ; j < personChilds.getLength() ; j++){ //判断当前的节点的类型是否是元素类型 if(personChilds.item(j).getNodeType() == Node.ELEMENT_NODE){ //取得当前节点对象 Element childElement = (Element)personChilds.item(j); if("name".equals(childElement.getNodeName())){ //取得第一个节点的文本值 person.setName(childElement.getFirstChild().getNodeValue()); }else if("age".equals(childElement.getNodeName())){ person.setAge(new Short(childElement.getFirstChild().getNodeValue())); } } } persons.add(person); } return persons; } |
通过以上代码可以让你了解到如何使用Dom来解析XML文件,不推荐使用(太耗费内存)
以上用到的person.xml文件代码:
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>liming</name> <age>30</age> </person> <person id="20"> <name>lixiangmei</name> <age>25</age> </person> </persons> |
1>首先调用DocumentBuilderFactory对象的newInstance()方法,得到DocumentBuilderFactory的对象。
2>其次调用DocumentBuilderFactory的对象的newDocumentBuilder()方法,得到DocumentBuilder对象,
该对象用来对XML文件进行解析
3>调用DocumentBuilder对象的parse方法,传入XML文件资源,得到Document对象
------------------------------------------------------------------------------------------------------------------------------------
下面的内容都是在内存中进行操作:
4>调用Document对象的getDocumentElement()方法来取得根节点对象root。
5>调用根节点对象root中的getElementsByTagName("根节点名"),得到一个节点列表NodeList对象。
注意:除了子节点(没有子节点的节点)外,其它节点对象都有一个item(int i)方法来得到每个子节点的对象。
6>循环迭代子节点(NodeList对象),得到子节点对象(Element对象).,调用getChildNodes()方法得到子节点列表。
7>再次循环迭代子节点对象,调用getNodeType()方法判断是否是元素类型,如果是取得该子节点下的节点对象,进行以上逻辑操作。