初次邂逅XML:
需要解析的XML文件:
这里有两个book子节点。
1、如何进行XML文件解析前的准备工作,另外解析先获取book节点。
这个我后来看懂了:
这个Node的ELEMENT_NODE=1和上面是一样的。
2、使用DOM解析XML文件的属性名和属性值(分两种情况)
第一种,当属性个数是1~N个的时候:
1 public class DOMTest { 2 3 public static void main(String[] args) { 4 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 5 try { 6 DocumentBuilder db = dbf.newDocumentBuilder(); 7 Document d = db.parse("books.xml"); 8 //1、根据节点名book,获取节点集合 9 NodeList nodelist = d.getElementsByTagName("book");10 //2、遍历集合中所有的元素(节点)11 for (int i = 0; i < nodelist.getLength(); i++) {12 Node node = nodelist.item(i);13 //3、获取每个节点的属性集合,并输出属性的个数14 NamedNodeMap attrMap = node.getAttributes();15 System.out.println("属性的个数是:"+attrMap.getLength());16 //4、遍历所有属性,并输出属性值17 for (int j = 0; j < attrMap.getLength(); j++) {18 Node attr = attrMap.item(j);19 System.out.println(attr.getNodeName()+":"+attr.getNodeValue());20 }21 }22 } catch (ParserConfigurationException e) {23 // TODO Auto-generated catch block24 e.printStackTrace();25 } catch (SAXException e) {26 // TODO Auto-generated catch block27 e.printStackTrace();28 } catch (IOException e) {29 // TODO Auto-generated catch block30 e.printStackTrace();31 }32 }33 }
第二种,当节点属性值只有一个的时候,可以这样:
1 public class DOMTest { 2 3 public static void main(String[] args) { 4 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 5 try { 6 DocumentBuilder db = dbf.newDocumentBuilder(); 7 Document d = db.parse("books.xml"); 8 //1、根据节点名book,获取节点集合 9 NodeList nodelist = d.getElementsByTagName("book");10 //2、遍历集合中所有的元素(节点),并强制转换为element11 for (int i = 0; i < nodelist.getLength(); i++) {12 Element node = (Element) nodelist.item(i);13 String str = node.getAttribute("id");14 System.out.println(str);15 }16 } catch (ParserConfigurationException e) {17 // TODO Auto-generated catch block18 e.printStackTrace();19 } catch (SAXException e) {20 // TODO Auto-generated catch block21 e.printStackTrace();22 } catch (IOException e) {23 // TODO Auto-generated catch block24 e.printStackTrace();25 }26 }27 }
上面两种情况的对比归纳,理解的时候,脑子里要有XML节点的图:
3、使用DOM解析XML文件的节点名和节点值
再来看XML的代码:
1 23 换行符算一个子节点,这里是第一个 4 9冰与火之歌 第二个换行符 5乔治马丁 第三个 62014 第四个 789 第五个,所以加上正儿八经的四个节点,一共9个子节点 810 15安徒生童话 112004 1277 13English 14
下面进行解析子节点:
获取节点名
获取节点值:
因为一个节点转为Element类型之后,比如<name>冰火之歌</name>中,冰火之歌就不是该节点的值NodeValue而是该节点的子节点。
两种获取子节点的value: