• 学习java的第三十三天。。。(XML解析)


    DOM解析XML

    保存XML文件

    获得TransformerFactory对象
    创建Transformer对象
    创建DOMSource对象---包含XML信息
    设置输出属性---编码格式
    创建StreamResult对象---包含保存文件的信息
    将XML保存到指定文件中

    1. //保存XML文件:将java内存中的document对象存储到外部xml文件中,需要借助转换器对象实现此功能
    2. public void savaXML(String path){
    3. //创建转换器工厂对象
    4. TransformerFactory factory=TransformerFactory.newInstance();
    5. //设置首行缩进,4个字符
    6. factory.setAttribute("indent-number", "4");
    7. try {
    8. //通过转换器工厂对象创建转换器对象
    9. Transformer transformer=factory.newTransformer();
    10. //设置存储的格式
    11. transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
    12. transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    13. // StreamResult result=new StreamResult(new FileOutputStream(path));
    14. StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312"));
    15. // StreamResult result=new StreamResult(path);
    16. DOMSource source=new DOMSource(document);
    17. /*
    18. * 通过转换器对象调用方法将java内存中的document对象存储到外部xml文件中,transform(Source source,Result result)
    19. * 需要两个参数,Source标识源头,也就是java内存中的document对象,而Source是一个接口,不能直接创建对象,可以使用其实现类DomSource
    20. * Result表示结果,也就是java内存中的document对象要存储的位置,而Result是一个接口,不能直接创建对象,可以使用其实现类StreamResult
    21. */
    22. transformer.transform(source, result);
    23. } catch (TransformerConfigurationException e) {
    24. e.printStackTrace();
    25. } catch (TransformerException e) {
    26. // TODO Auto-generated catch block
    27. e.printStackTrace();
    28. } catch (FileNotFoundException e) {
    29. // TODO Auto-generated catch block
    30. e.printStackTrace();
    31. } catch (UnsupportedEncodingException e) {
    32. // TODO Auto-generated catch block
    33. e.printStackTrace();
    34. }
    35. }

    添加DOM节点

    通过Document调用方法创建一个元素节点
    通过创建的元素节点调用方法给元素节点设置属性及属性值
    将创建好的两个节点建立关系
    获取xml文件中创建好的标签的上一个元素节点,然后将创建好的标签作为子节点追加到获取元素节点中,一直追加到无法追加为止
    元素添加完毕之后需要将java内存中的document对象存储到xml文件中 

    1. //添加元素到XML文件中
    2. public void add(){
    3. //通过Document调用方法创建一个元素节点
    4. Element element=document.createElement("Brand");
    5. //通过创建的元素节点调用方法给元素节点设置属性及属性值
    6. element.setAttribute("name", "三星");
    7. //通过Document调用方法创建一个元素节点
    8. Element ele1=document.createElement("Type");
    9. //通过创建的元素节点调用方法给元素节点设置属性及属性值
    10. ele1.setAttribute("name", "Note3");
    11. //将创建好的两个节点建立关系
    12. element.appendChild(ele1);
    13. //获取xml文件中的第一个PhoneInfo元素节点,然后将创建好的brand标签作为子节点追加到获取的第一个PhoneInfo元素节点中
    14. document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
    15. //元素添加完毕之后需要将java内存中的document对象存储到xml文件中
    16. this.savaXML("收藏信息.xml");
    17. }

    修改DOM节点

    通过document对象获取你要修改的元素,将获取的元素存储在节点集合中
    遍历节点集合:修改节点(给节点添加了一个id属性)
    取出节点集合中的元素
    将节点元素转换成其真正的类型
    给元素节点添加了一个新的属性id

    1. //修改:修改xml文件中的内容
    2. public void update(){
    3. //通过document对象获取你要修改的元素,将获取的元素存储在节点集合中
    4. NodeList brands=document.getElementsByTagName("Brand");
    5. //遍历节点集合:修改节点(给节点添加了一个id属性)
    6. for(int i=0;i
    7. //取出节点集合中的元素
    8. Node brand=brands.item(i);
    9. //将节点元素转换成其真正的类型
    10. Element eleBrand=(Element)brand;
    11. //给元素节点添加了一个新的属性id
    12. eleBrand.setAttribute("id", i+"");
    13. }
    14. this.savaXML("收藏信息.xml");
    15. }

    删除DOM节点

    通过document对象获取你想要删除的元素节点,将元素节点存储在节点集合中
    遍历集合 取出节点集合中的元素
    将节点转换成真正的类型
    从遍历出的元素节点找出你要删除的元素节点,通过元素节点的属性值来找
    删除元素不能自己删除自己,需要通过其父元素来删除,getParentNode(),获取父节点 removeChild()删除子节点

    1. public void delete(){
    2. //通过document对象获取你想要删除的元素节点,将元素节点存储在节点集合中
    3. NodeList brands=document.getElementsByTagName("Brand");
    4. //遍历集合
    5. for(int i=0;i
    6. //取出节点集合中的元素
    7. Node brand=brands.item(i);
    8. //将节点转换成真正的类型
    9. Element eleBrand=(Element)brand;
    10. //从遍历出的元素节点找出你要删除的元素节点,通过元素节点的属性值来找
    11. if(eleBrand.getAttribute("name").equals("华为")){
    12. //删除元素不能自己删除自己,需要通过其父元素来删除,getParentNode(),获取父节点 removeChild()删除子节点
    13. eleBrand.getParentNode().removeChild(eleBrand);
    14. }
    15. }
    16. this.savaXML("收藏信息.xml");
    17. }

    DOM4J解析XML

    DOM4J

    Document:定义XML文档
    Element:定义XML元素
    Text:定义XML文本节点
    Attribute:定义了XML 的属性

    使用DOM4J需要导入文件,https://dom4j.github.io/#parsing 在这里面可以找到

     随便找一个,下载.jar文件。下载好之后接下来就是导入包了

     

    将刚才下载下来的文件复制到刚刚创建的文件夹中 

     

     

     

     

     

     

     

     

     这样就好了。

    1. public class Dom4j {
    2. public static Document doc;
    3. public static void main(String[] args) {
    4. loadDocument();
    5. // showPhoneInfo();
    6. // saveXML("收藏信息.xml");
    7. // addNewPhoneInfo();
    8. // updatePhoneInfo();
    9. deleteItem();
    10. showPhoneInfo();
    11. }
    12. //定义方法,将xml文件转换为document对象
    13. public static void loadDocument(){
    14. try{
    15. //创建SAXReader类对象,调用reader()方法将XMl文件转换为document类对象
    16. SAXReader saxReader = new SAXReader();
    17. doc = saxReader.read(new File("收藏信息.xml"));
    18. }catch (Exception e) {
    19. // TODO: handle exception
    20. e.printStackTrace();
    21. }
    22. }
    23. public static void updatePhoneInfo(){
    24. // 获取XML的根节点
    25. Element root = doc.getRootElement();
    26. int id = 0;
    27. for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
    28. Element brand = (Element) itBrand.next();
    29. id++;
    30. brand.addAttribute("id", id + "");
    31. }
    32. saveXML("收藏信息.xml");
    33. }
    34. public static void deleteItem(){
    35. // 获取XML的根节点
    36. Element root = doc.getRootElement();
    37. for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
    38. Element brand = (Element) itBrand.next();
    39. if (brand.attributeValue("name").equals("华为")) {
    40. //删除元素需要通过其父元素来进行删除
    41. brand.getParent().remove(brand);
    42. }
    43. }
    44. saveXML("收藏信息.xml");
    45. }
    46. //定义方法显示XML文件中的手机品牌和类型
    47. public static void showPhoneInfo() {
    48. // 获取XML的根节点
    49. Element root = doc.getRootElement();
    50. // 通过根节点调用elementIterator()方法获取根节点的所有子元素Brand,将获取的brand标签存储在迭代器中,然后遍历所有的Brand标签
    51. for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
    52. Element brand = (Element) itBrand.next();
    53. // attributeValue(属性名: )根据属性名输出标签的name属性
    54. System.out.println("品牌:" + brand.attributeValue("name"));
    55. // 使用brand节点调用elementIterator()方法获取brand标签的子标签type,然后遍历Type标签
    56. for (Iterator itType = brand.elementIterator(); itType.hasNext();) {
    57. Element type = (Element) itType.next();
    58. // attributeValue(属性名: )根据属性名输出标签的name属性
    59. System.out.println("\t型号:" + type.attributeValue("name"));
    60. }
    61. }
    62. }
    63. public static void saveXML(String path){
    64. try {
    65. OutputFormat format = OutputFormat.createPrettyPrint();
    66. format.setEncoding("GBK"); // 指定XML编码
    67. XMLWriter writer;
    68. writer = new XMLWriter(new FileWriter(path), format);
    69. writer.write(doc);
    70. writer.close();
    71. } catch (IOException e) {
    72. // TODO Auto-generated catch block
    73. e.printStackTrace();
    74. }
    75. }
    76. public static void addNewPhoneInfo(){
    77. // 获取XML的根节点
    78. Element root = doc.getRootElement();
    79. // 创建Brand标签
    80. Element el = root.addElement("Brand");
    81. // 给Brand标签设置属性
    82. el.addAttribute("name", "三星");
    83. // 创建Type标签
    84. Element typeEl = el.addElement("Type");
    85. // 给Type标签设置属性
    86. typeEl.addAttribute("name", "Note4");
    87. saveXML("src/收藏信息.xml");
    88. }
    89. }

  • 相关阅读:
    【C++初阶7-string】真方便,真舒服
    std::function
    基于文化算法优化的神经网络预测研究(Matlab代码实现)
    无代码开发平台子管理员入门教程
    微信公众号window.open(url, '_blank');打不开网页
    灵性图书馆:好书推荐-《奥修传》
    Git系列讲解 —— 提交日志(git log)的使用
    Anniversary party(树形dp 基础题)
    备忘录模式-撤销功能的实现
    Ajax学习56~68(跨域与JSONP)
  • 原文地址:https://blog.csdn.net/qihaojinqiuma/article/details/126530423