/** * 该类主要实现xml的基本操做 * * @param FilePath 写入xml文件的路径 * 2019年8月27日 15:37:08 */ public static void testXml(String FilePath) throws IOException { Document domcment = DocumentHelper.createDocument(); //经过这句定义一个xml文档对象 Element root = domcment.addElement("node"); //经过这局定义一个xml元素,这里添加的是根节点,一个文档只能存在一个根节点,不然会报错 /* * Element有几个重要的方法: * 一、addComment:添加注释 * 二、addAttribute:添加属性 * 三、addElement:添加子元素 * */ root.addComment("这是一我的员信息的xml"); //root.addAttribute("name","zhangsan"); Element first = root.addElement("skills");//根节点下添加节点 first.addAttribute("name", "三分归元气");//给子节点添加name属性 Element info = first.addElement("info"); //节点下添加节点 info.setText("风云雄霸天下");// 节点设置内容数据 Element first1 = root.addElement("skill"); first1.addAttribute("names", "风神腿"); Element info1 = first1.addElement("info"); info1.setText("风神腿,独步武林"); info1.addComment("拥有该腿,独步武林"); /* * 最后经过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,能够经过OutputFormat类格式化输出, * 默认采用createCompactFormat()显示比较紧凑,最好使用createPrettyPrint()。 * */ OutputFormat format = OutputFormat.createPrettyPrint();//建立格式化类 format.setEncoding("UTF-8"); //设置编码格式,默认为UTF-8 FileOutputStream fos = new FileOutputStream(FilePath);//建立输出流,此处要使用Writer,须要指定输入编码格式,使用OutputStream则不用 XMLWriter writer = new XMLWriter(fos, format); //建立xml输出流 writer.write(domcment); writer.close(); System.out.println("输出流已经关闭"); } /** * 使用dom4j解析xml文件SAXReader *****Element元素API***** * getQName() 元素的QName对象 * getNamespace() 元素所属的Namespace对象 * getNamespacePrefix() 元素所属的Namespace对象的prefix * getNamespaceURI() 元素所属的Namespace对象的URI * getName() 元素的local name * getQualifiedName() 元素的qualified name * getText() 元素所含有的text内容,若是内容为空则返回一个空字符串而不是null * getTextTrim() 元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null * attributeIterator() 元素属性的iterator,其中每一个元素都是Attribute对象 * attributeValue() 元素的某个指定属性所含的值 * elementIterator() 元素的子元素的iterator,其中每一个元素都是Element对象 * element() 元素的某个指定(qualified name或者local name)的子元素 * elementText() 元素的某个指定(qualified name或者local name)的子元素中的text信息 * getParent 元素的父元素 * getPath() 元素的XPath表达式,其中父元素的qualified name和子元素的qualified name之间使用"/"分隔 * isTextOnly() 是否该元素只含有text或是空元素 * isRootElement() 是否该元素是XML树的根节点 * * *****Attribute属性API***** * getQName() 属性的QName对象 * getNamespace() 属性所属的Namespace对象 * getNamespacePrefix() 属性所属的Namespace对象的prefix * getNamespaceURI() 属性所属的Namespace对象的URI * getName() 属性的local name * getQualifiedName() 属性的qualified name * getValue() 属性的值 * @param xmlFile 要解析xml的文件 * 2019-08-27 15:42:45 */ public static void parseXml(String xmlFile) throws DocumentException { SAXReader saxReader = new SAXReader(); //使用SAXReader解析xml Document document = saxReader.read(new File(xmlFile));//获取document对象 Element root = document.getRootElement(); //访问根节点 //访问全部叶子节点 List skills = root.elements(); for (Iterator<?> it = skills.iterator(); it.hasNext(); ) { Element e = (Element) it.next(); System.out.println(e); } //访问指定名称的节点,如访问名称为“skill”的所有节点 List skill = root.elements("skill"); for (Iterator<?> it = skill.iterator(); it.hasNext(); ) { Element e = (Element) it.next(); System.out.println(e); } //访问指定名称的第一个节点 Element skillsNode = root.element("skills"); System.out.println(skillsNode); //获取指定员元素下的属性 Attribute attribute = skillsNode.attribute("name"); System.out.println(attribute); //按照属性顺序获取属性 Attribute attribute1 = skillsNode.attribute(0); System.out.println(attribute1); //用xpath表达式获取节点和属性 List list = document.selectNodes("//skills/@name"); for (Iterator it = list.iterator();it.hasNext();){ Attribute attribute2 = (Attribute) it.next(); System.out.println(attribute2); } //删除某个节点 root.remove(skillsNode); System.out.println("节点删除成功"); //删除指定名称的属性 root.remove(skillsNode.attribute("name")); System.out.println("删除指定名称的属性"); //修改节点名称和节点值 skillsNode.setName("new_skill"); skillsNode.setText("你好啊,赛利亚"); } public static void main(String[] args) throws IOException, DocumentException { //testXml("d:/skills.xml"); parseXml("d:/skills.xml"); }