使用DOM解析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>
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;}