您的当前位置:首页正文

Java解析XML文件的常用方法介绍

2022-07-03 来源:小奈知识网
Java解析XML⽂件的常⽤⽅法介绍

  XML是⼀个可扩展标记语⾔。很多时候我们需要进⾏数据交换,同时也存在跨平台使⽤,XML⽂件对这些需求提供了很好的帮助!  对于Java来说,XML常见的⽤途就是保存数据和配置,这就涉及了对XML⽂件的增删改查操作!

  Java常见的XML解析⽅式分为DOM解析、SAX解析、DOM4j解析,下⾯是这三种解析⽅式的优缺点:  1、DOM解析

  ⽅便遍历,随机访问某⼀个节点,修改XML。缺点是⼀次性读取到内存。  2、SAX解析

  从上⾄下⼀个个节点去解析,触发事件(调⽤相应的⽅法)来进⾏处理。不能对xml进⾏修改。占⽤内存⼩。  3、DOM4j

  第三⽅的开源的解析⼯具,⽅便使⽤。XML⽂件:(src/name.xml)

1 2

3 4 20 5

6 7 25 8

9 10 3011 12

  下⾯我就来介绍DOM和DOM4j来解析上⾯的XML⽂件的⽅法:

DOM解析:

1 import java.io.IOException; 2

3 import javax.xml.parsers.DocumentBuilder;

4 import javax.xml.parsers.DocumentBuilderFactory;

5 import javax.xml.parsers.ParserConfigurationException; 6 import javax.xml.transform.Transformer;

7 import javax.xml.transform.TransformerConfigurationException; 8 import javax.xml.transform.TransformerException; 9 import javax.xml.transform.TransformerFactory; 10 import javax.xml.transform.dom.DOMSource; 11 import javax.xml.transform.stream.StreamResult; 12

13 import org.w3c.dom.Document; 14 import org.w3c.dom.Element; 15 import org.w3c.dom.Node; 16 import org.w3c.dom.NodeList;

17 import org.xml.sax.SAXException; 18

19 public class DOM { 20

21 public static void main(String[] args) { 22 // TODO Auto-generated method stub 23 try {

24 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 25 // 创建DOM解析器⼯⼚

26 DocumentBuilder db = dbf.newDocumentBuilder();

27 // 调⽤DOM解析器⼯⼚的newDocumentBuilder()⽅法得到DOM解析器对象 28 Document doc = db.parse(\"src\\\\name.xml\");

29 // 调⽤DOM解析器对象parse(String uri)⽅法得到Document对象 30 NodeList nl = doc.getElementsByTagName(\"name\");

31 // 调⽤Document对象的getElementsByTagName(String tagname)⽅法得到NodeList对象 32 /*

33 * 遍历XML中的元素 34 */

35 for (int i = 0; i < nl.getLength(); i++) { 36 Node node = nl.item(i);

37 // 通过NodeList的item(int index)⽅法得到NodeList中的Node对象 38 Element element = (Element) node;

39 // 通过Node对象强制转换的⽅法得到Element对象

40 String id = element.getAttribute(\"id\");

41 // 通过Element对象的getgetAttribute(String name)⽅法得到id属性值 42 System.out.println(id); 43 // 打印id属性值

44 String age = element.getElementsByTagName(\"age\").item(0).getTextContent(); 45 // 通过Element对象的getElementsByTagName(String name)⽅法得到age的属性值 46 System.out.println(age); 47 // 打印age 48 } 49 /*

50 * 添加元素到XML中 51 */

52 Element root = doc.getDocumentElement();

53 // 通过Document对象的getDocumentElement()⽅法得到根节点 54 Element newname = doc.createElement(\"name\");

55 // 通过Document对象的createElement(String tagName)⽅法得到新的name元素 56 newname.setAttribute(\"id\⼩明\");

57 // 通过调⽤Element对象的setAttribute(String name,String value)⽅法为id赋值 58 Element newage = doc.createElement(\"age\");

59 // 通过Document对象的createElement(String tagName)⽅法得到新的age元素 60 newage.setTextContent(\"18\");

61 // 通过调⽤Element对象的setTextContent(String textContent)⽅法为age赋值 62 newname.appendChild(newage); 63 // 添加age到name中

64 root.appendChild(newname); 65 // 添加name到根节点中 66 /*

67 * 修改XML中的元素 68 */

69 for (int i = 0; i < nl.getLength(); i++) {

70 Element fixname = (Element) nl.item(i); 71 // 得到要修改的Element对象

72 String fixnewname = fixname.getAttribute(\"id\"); 73 // 获取到要修改对象的id属性值 74 /*

75 * 判断name是否为要修改的对象 76 */

77 if (fixnewname.equals(\"⼩明\")) {

78 Element sex = doc.createElement(\"sex\"); 79 // 创建新的Element对象

80 sex.setAttribute(\"sex\男\"); 81 // 给新的Element对象的属性赋值 82 fixname.appendChild(sex);

83 // 添加新的Element(sex)对象到Element(fixname)对象中 84 } 85 } 86 /*

87 * 删除XML中的元素 88 */

89 root.removeChild(root.getChildNodes().item(7));

90 // ⾸先通过根节点访问⼦节点,得到Node对象,然后调⽤根节点的removeChild(Node oldChild)⽅法删除元素 91 /*

92 * 将更改写⼊到XML⽂件中 93 */

94 TransformerFactory tf = TransformerFactory.newInstance();

95 // 调⽤TransformerFactory的newInstance()⽅法得到TransformerFactory对象 96 Transformer t = tf.newTransformer();

97 // 调⽤TransformerFactory对象的newTransformer()⽅法得到Transformer对象 98 t.transform(new DOMSource(doc), new StreamResult(\"src\\\\name.xml\")); 99 // 调⽤Transformer对象的transform(Source xmlSource,Result100 // outputTarget)⽅法将修改写⼊到name.xml⽂件中101 } catch (ParserConfigurationException e) {102 // TODO Auto-generated catch block103 e.printStackTrace();104 } catch (SAXException e) {

105 // TODO Auto-generated catch block106 e.printStackTrace();107 } catch (IOException e) {

108 // TODO Auto-generated catch block109 e.printStackTrace();

110 } catch (TransformerConfigurationException e) {111 // TODO Auto-generated catch block112 e.printStackTrace();

113 } catch (TransformerException e) {

114 // TODO Auto-generated catch block115 e.printStackTrace();116 }117 }118 119 }

遍历运⾏结果:

1 张三2 203 李四4 255 王五6 30

添加运⾏结果:

1 2

3 4 20 5

6 7 25 8

9 10 3011

12 13 1814 15

修改运⾏结果:

1 2

3 4 20 5

6 7 25 8

9 10 3011

12 13 1814 15 16

删除运⾏结果:

1 2

3 4 20 5

6 7 25 8

9 10 3011 12

DOM4j解析:

使⽤DOM4j解析需要添加第三⽅⼯具包,具体⽹址:

1 import org.dom4j.Document;

2 import org.dom4j.DocumentException; 3 import org.dom4j.Element;

4 import org.dom4j.io.SAXReader; 5 import org.dom4j.io.XMLWriter; 6

7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException;

10 import java.io.UnsupportedEncodingException;11 import java.util.List;12

13 public class DOM4j {14

15 public static void main(String[] args) {16 // TODO Auto-generated method stub17 try {

18 // 遍历

19 SAXReader sr = new SAXReader();

20 Document doc = sr.read(\"src\\\\name.xml\");21 Element root = doc.getRootElement();

22 List name = root.elements(\"name\");23 for (Element names : name) {

24 System.out.println(names.attributeValue(\"id\"));25 List age = names.elements(\"age\");26 for (Element ages : age) {

27 System.out.println(ages.getText());28 }29 }

30 // 添加

31 Element newname = root.addElement(\"name\");32 newname.addAttribute(\"id\⼩明\");

33 Element newage = newname.addElement(\"age\");34 newage.setText(\"18\");35 //删除

36 root.remove(name.get(3));37 // 写⼊

38 XMLWriter xw = new XMLWriter(new FileOutputStream(\"src\\\\name.xml\"));39 xw.write(doc);

40 } catch (DocumentException e) {

41 // TODO Auto-generated catch block42 e.printStackTrace();

43 } catch (UnsupportedEncodingException e) {44 // TODO Auto-generated catch block45 e.printStackTrace();

46 } catch (FileNotFoundException e) {47 // TODO Auto-generated catch block48 e.printStackTrace();49 } catch (IOException e) {

50 // TODO Auto-generated catch block51 e.printStackTrace();52 }53 }54 55 }

运⾏结果上同。

因篇幅问题不能全部显示,请点此查看更多更全内容