• 读取XML的几种方式


    一、为什么使用XML

    1、便于不同应用程序之间通信。
    2、便于不同平台之间通信。
    3、便于不同平台之间数据共享

    二、Dom读取

    xml文件内容

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <bookstore>
    3. <book id="1">
    4. <name>冰与火之歌</name>
    5. <author>乔治马丁</author>
    6. <year>2014</year>
    7. <price>89</price>
    8. </book>
    9. <book id="2">
    10. <name>安徒生童话</name>
    11. <year>2004</year>
    12. <price>77</price>
    13. <language>English</language>
    14. </book>
    15. </bookstore>

    dom代码

    1. import javax.xml.parsers.DocumentBuilder;
    2. import javax.xml.parsers.DocumentBuilderFactory;
    3. import org.dom4j.Node;
    4. import org.w3c.dom.Document;
    5. import org.w3c.dom.NodeList;
    6. public class DomReadXml {
    7. public static void main(String[] args) {
    8. readXml();
    9. }
    10. public static void readXml() {
    11. try {
    12. // 创建解析器工厂
    13. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    14. DocumentBuilder db = factory.newDocumentBuilder();
    15. // 创建一个Document对象
    16. Document doc = db.parse("books.xml");
    17. NodeList bookList = doc.getElementsByTagName("book");
    18. // 获取节点个数
    19. System.out.println("一共有" + bookList.getLength() + "本书");
    20. // 遍历每个book节点
    21. for (int i = 0; i < bookList.getLength(); i++) {
    22. System.out.println("*******************************");
    23. // 索引从零开始
    24. org.w3c.dom.Node book = bookList.item(i);
    25. // 获取book节点所有属性集合
    26. org.w3c.dom.NamedNodeMap attrs = book.getAttributes();
    27. System.out.println("第" + (i + 1) + "本书共有" + attrs.getLength() + "属性");
    28. // 遍历book属性,不知道节点属性和属性名情况
    29. for (int j = 0; j < attrs.getLength(); j++) {
    30. // 获取某一个属性
    31. org.w3c.dom.Node attr = attrs.item(j);
    32. System.out.print("属性名:" + attr.getNodeName());
    33. System.out.println(" --- 属性值:" + attr.getNodeValue());
    34. }
    35. // 若已经知道book节点有且只有1个ID属性,可用以下方式
    36. // org.w3c.dom.Element e = (org.w3c.dom.Element)
    37. // bookList.item(i);
    38. // System.out.println("Element属性值:"+e.getAttribute("id"));
    39. NodeList childNodes = book.getChildNodes();
    40. for (int k = 0; k < childNodes.getLength(); k++) {
    41. // 区分,去掉空格和换行符
    42. if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
    43. // 获取element类型的节点和节点值
    44. System.out.print("节点名:" + childNodes.item(k).getNodeName());
    45. System.out.print(" --- 节点值:" + childNodes.item(k).getFirstChild().getNodeValue());
    46. System.out.println(" --- 节点值:"+childNodes.item(k).getTextContent());
    47. }
    48. }
    49. }
    50. } catch (Exception e) {
    51. e.printStackTrace();
    52. }
    53. }
    54. }

    结果输出:
    这里写图片描述

    三、Dom4j读取

    使用dom4j需要导入相关的jar包

    1. import java.io.File;
    2. import java.util.Iterator;
    3. import java.util.List;
    4. import org.dom4j.Attribute;
    5. import org.dom4j.Document;
    6. import org.dom4j.Element;
    7. import org.dom4j.io.SAXReader;
    8. public class Dom4jReadXml {
    9. public static void main(String[] args) {
    10. readXml();
    11. }
    12. public static void readXml(){
    13. try {
    14. // 创建SAXReader对象
    15. SAXReader reader = new SAXReader();
    16. // 加载xml文件
    17. Document dc= reader.read(new File("books.xml"));
    18. // 获取根节点
    19. Element e = dc.getRootElement();
    20. // 获取迭代器
    21. Iterator it = e.elementIterator();
    22. // 遍历迭代器,获取根节点信息
    23. while(it.hasNext()){
    24. Element book = (Element) it.next();
    25. List<Attribute> atts= book.attributes();
    26. // 获取book属性名和属性值
    27. for (Attribute att : atts) {
    28. System.out.println("节点名:"+att.getName()+"节点值:"+att.getValue());
    29. }
    30. Iterator itt = book.elementIterator();
    31. while(itt.hasNext()){
    32. Element b = (Element) itt.next();
    33. System.out.println("属性名:"+b.getName()+"属性值:"+b.getText());
    34. }
    35. }
    36. } catch (Exception e) {
    37. // TODO: handle exception
    38. }
    39. }
    40. }

    结果输出:
    这里写图片描述

    四、JDom读取

    使用jdom需要导入相关的jar包

    1. import java.io.FileInputStream;
    2. import java.io.InputStream;
    3. import java.io.InputStreamReader;
    4. import java.util.ArrayList;
    5. import java.util.List;
    6. import org.jdom.Attribute;
    7. import org.jdom.Document;
    8. import org.jdom.Element;
    9. import org.jdom.input.SAXBuilder;
    10. public class JDomReadXml {
    11. public static void main(String[] args) {
    12. //
    13. readXml();
    14. }
    15. @SuppressWarnings("unchecked")
    16. public static void readXml(){
    17. List<Book> bList = new ArrayList<Book>();
    18. try {
    19. // 创建一个SAXBuilder对象
    20. SAXBuilder builder = new SAXBuilder();
    21. // 创建一个输入流
    22. InputStream in = new FileInputStream("books.xml");
    23. // 处理乱码情况
    24. InputStreamReader isr = new InputStreamReader(in, "UTF-8");
    25. // 通过build方法,将输入流加载到SAXBuilder中
    26. Document doc = builder.build(isr);
    27. // 通过Document对象获取根节点
    28. Element foo= doc.getRootElement();
    29. // 获取根节点下子节点名
    30. List<Element> allChildren = foo.getChildren();
    31. // 进行解析
    32. for (Element book : allChildren) {
    33. Book b = new Book();
    34. System.out.println("开始解析第"+(allChildren.indexOf(book)+1)+"本书");
    35. // 解析book属性集合
    36. List<Attribute> attrList = book.getAttributes();
    37. // 遍历(针对不清楚节点下属性名)
    38. for (Attribute attr : attrList) {
    39. System.out.println("属性名:"+attr.getName() +" -- 属性值:"+attr.getValue());
    40. if("id".equals(attr.getName())){
    41. b.setId(attr.getValue());
    42. }
    43. }
    44. // 清楚知道属性名获取属性值
    45. String v = book.getAttributeValue("id");
    46. System.out.println("清楚知道属性名"+v);
    47. // 对book节点子节点的节点名和节点值进行遍历
    48. List<Element> bookChiles = book.getChildren();
    49. for (Element element : bookChiles) {
    50. System.out.println("属性名:"+element.getName() +" -- 属性值:"+element.getValue());
    51. if("name".equals(element.getName())){
    52. b.setName(element.getValue());
    53. }else if("author".equals(element.getName())){
    54. b.setAuthor(element.getValue());
    55. }else if("year".equals(element.getName())){
    56. b.setYear(element.getValue());
    57. }else if("price".equals(element.getName())){
    58. b.setPrice(element.getValue());
    59. }else if("language".equals(element.getName())){
    60. b.setLanguage(element.getValue());
    61. }
    62. }
    63. System.out.println("结束解析第"+(allChildren.indexOf(book)+1)+"本书");
    64. bList.add(b);
    65. b = null;
    66. }
    67. } catch (Exception e) {
    68. e.printStackTrace();
    69. }
    70. }
    71. }

    结果输出:
    这里写图片描述

    五、Sax读取

    1. import javax.xml.parsers.SAXParser;
    2. import javax.xml.parsers.SAXParserFactory;
    3. public class SaxReadXml {
    4. public static void main(String[] args) {
    5. readXml();
    6. }
    7. public static void readXml() {
    8. try {
    9. // 创建工厂
    10. SAXParserFactory sf=SAXParserFactory.newInstance();
    11. // 获取SAXParser实例
    12. SAXParser sp = sf.newSAXParser();
    13. // 创建一个解析对象
    14. SAXParserHandler handler = new SAXParserHandler();
    15. sp.parse("books.xml", handler);
    16. for(Book book : handler.getbList()){
    17. System.out.println(book.getId());
    18. System.out.println(book.getName());
    19. System.out.println(book.getAuthor());
    20. System.out.println(book.getYear());
    21. System.out.println(book.getPrice());
    22. System.out.println(book.getLanguage());
    23. System.out.println("*****************");
    24. }
    25. } catch (Exception e) {
    26. e.printStackTrace();
    27. }
    28. }
    29. }

    SAXParserHandler .java

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. import org.xml.sax.Attributes;
    4. import org.xml.sax.SAXException;
    5. import org.xml.sax.helpers.DefaultHandler;
    6. public class SAXParserHandler extends DefaultHandler {
    7. int bookIndex = 0;
    8. String str = null;
    9. Book b = null;
    10. private List<Book> bList = new ArrayList<Book>();
    11. public List<Book> getbList() {
    12. return bList;
    13. }
    14. /**
    15. * 用来遍历xml文件的开始标签
    16. */
    17. @Override
    18. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    19. // 调用DefaultHandler的startElement方法
    20. super.startElement(uri, localName, qName, attributes);
    21. // 开始解析book元素属性
    22. if(qName.equals("book")){
    23. bookIndex++;
    24. // 创建一个book对象
    25. b = new Book();
    26. System.out.println("****开始第"+bookIndex+"本书内容****");
    27. // 已知book元素下属性名称,根据属性名称获取属性值s
    28. String value = attributes.getValue("id");
    29. System.out.println("book的属性值是:"+value);
    30. int num = attributes.getLength();
    31. for(int i=0;i<num;i++){
    32. System.out.print("book元素的第"+(i+1)+"个属性名是:"+attributes.getQName(i));
    33. System.out.println(" -- 属性值是:"+attributes.getValue(i));
    34. if(attributes.getQName(i).equals("id")){
    35. b.setId(attributes.getQName(i));
    36. }
    37. }
    38. }else if(!qName.equals("book") && !qName.equals("bookstore")){
    39. System.out.print("节点名是:"+qName);
    40. }
    41. }
    42. /**
    43. * 用来遍历xml文件的结束标签
    44. */
    45. @Override
    46. public void endElement(String uri, String localName, String qName) throws SAXException {
    47. // 调用DefaultHandler的endElement方法
    48. super.endElement(uri, localName, qName);
    49. // 判断是否针对一本书已经遍历结束
    50. if(qName.equals("book")){
    51. bList.add(b);
    52. b = null;
    53. System.out.println("****结束第"+bookIndex+"本书内容****");
    54. }else if(qName.equals("name")){
    55. b.setName(str);
    56. }else if(qName.equals("author")){
    57. b.setAuthor(str);
    58. }else if(qName.equals("year")){
    59. b.setYear(str);
    60. }else if(qName.equals("price")){
    61. b.setPrice(str);
    62. }else if(qName.equals("language")){
    63. b.setLanguage(str);
    64. }
    65. }
    66. /**
    67. * 用来标志解析开始
    68. */
    69. @Override
    70. public void startDocument() throws SAXException {
    71. // 调用DefaultHandler的startDocument方法
    72. super.startDocument();
    73. System.out.println("解析开始");
    74. }
    75. /**
    76. * 用来标志解析结束
    77. */
    78. @Override
    79. public void endDocument() throws SAXException {
    80. // 调用DefaultHandler的endDocument方法
    81. super.endDocument();
    82. System.out.println("解析结束");
    83. }
    84. /**
    85. * 用来标志解析结束
    86. */
    87. @Override
    88. public void characters(char[] ch, int start, int length) throws SAXException {
    89. // 调用DefaultHandler的characters方法
    90. super.characters(ch, start, length);
    91. str = new String(ch, start, length);
    92. if(!str.trim().equals("")){
    93. System.out.println(" -- 节点值是:"+str);
    94. }
    95. }
    96. }

    结果输出:
    这里写图片描述

    六、附赠properties的读取

    在src文件中新建文件dataBase.properties
    在文件中写入projectName=\u6D4B\u8BD5\u9879\u76EE

    1. public class ReadProperties {
    2. public static void main(String[] args){
    3. System.out.println(getProjectName());
    4. }
    5. public static String getProjectName() {
    6. Properties pro = new Properties();
    7. try {
    8. // 获取文件内容
    9. InputStream cp = ReadProperties.class.getResourceAsStream("/dataBase.properties");
    10. // 加载
    11. pro.load(cp);
    12. // 获取projectName属性
    13. return pro.getProperty("projectName");
    14. } catch (Exception e) {
    15. e.printStackTrace();
    16. return "出错了";
    17. }
    18. }
    19. }

    结果输出:测试项目

    七、总结

    1. * dom平台无关,官方解析方式,一次性加载,方便解析,代码容易编写,当文件过大,容易造成内存溢出
    2. * sax基于事件驱动的解析方式,加载时进行验证判断,内存耗费小,不易编码,很难同时访问一个xml中的多处不同数据
    3. *
    4. * jdom和dom4j是基于sax扩展
    5. *
    6. * jdom仅使用具体类而不使用接口,api中大量使用了collections类
    7. *
    8. * dom4j是jdom的一种智能分支,具有性能优异,灵活性好,功能强大和易使用的特点
  • 相关阅读:
    Windows使用ssh远程连接(虚拟机)Linux(Ubuntu)的方法
    正则表达式每个字符的学习
    微擎模块 美容美发营销版,最新版v1.9.6 原版可用
    linux核心知识梳理
    dotnet 6 在 Win7 系统证书链错误导致 HttpWebRequest 内存泄露
    需求管理手册-对需求描述的要求(8)
    Vue编程式路由导航
    Driud数据库连接池的使用
    数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大难点分析
    企业运维实践-Nginx使用geoip2模块并利用MaxMind的GeoIP2数据库实现处理不同国家或城市的访问最佳...
  • 原文地址:https://blog.csdn.net/w2765076540/article/details/132823264