施用DOM解析xml
使用DOM解析xml
解析xml的技术有很多中,本函数使用的是DOM技术,其中person类中有id,name,age三个属性。xml文件内容如下:
下面是对上面的xml文件进行解析的详细代码。当然,解析前要将xml文件写道输入流当中。
解析xml的技术有很多中,本函数使用的是DOM技术,其中person类中有id,name,age三个属性。xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <persons> <person id="7"> <name>shifu</name> <age>21</age> </person> <person id="20"> <name>xiaobaozi</name> <age>21</age> </person> <person id="33"> <name>xiaozeng</name> <age>22</age> </person> </persons>
下面是对上面的xml文件进行解析的详细代码。当然,解析前要将xml文件写道输入流当中。
public List<Person> parser(InputStream inStream) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = factory.newDocumentBuilder(); /* 对输入流进行解析 */ Document document = documentBuilder.parse(inStream); /* 取得xml中以元素形式组成的文档树 */ Element root = document.getDocumentElement(); /* 取得以person为根元素的所有子元素的集合(包括person下的所有元素) */ NodeList personNodes = root.getElementsByTagName("person"); /* 存放解析出来的对象 */ List<Person> persons = new ArrayList<Person>(); for(int i = 0; i < personNodes.getLength(); ++i) { /* 取得person节点 */ Element personNode = (Element) personNodes.item(i); Person person = new Person(); /* 取得person节点的id属性的值并赋值给person对象 */ person.setId(new Integer(personNode.getAttribute("id"))); /* 取得person节点的所有子节点 */ NodeList childNodes = personNode.getChildNodes(); for(int k = 0; k < childNodes.getLength(); ++k) { /* 此处要注意,如果子元素是文本节点而不是元素节点,是不能转换成Element对象的 * 所以下面这句应当放到if语句里面,否则将会出现类型转换错误 */ // Element child = (Element) childNodes.item(k); /* 判断当前节点是否是元素节点 */ if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) { /* 是元素节点,可以转换 */ Element child = (Element) childNodes.item(k); /* 该节点的名称是否是name或age,是则取得他们第一个子节点的文本的值赋值给person对象 */ if("name".equals(child.getNodeName())) { person.setName(child.getFirstChild().getNodeValue()); } else if("age".equals(child.getNodeName())) { person.setAge(new Short(child.getFirstChild().getNodeValue())); } } } /* 将生成的对象添加到persons集合中 */ persons.add(person); } inStream.close(); return persons; }