目录
DOM解析XML文件步骤:
1.创建解析器工厂对象DocumentBuilderFactory
2.通过解析器工厂对象创建解析器对象
3.通过解析器对象调用方法将XML文件转换Document对象
4.通过Document对象去操作XML文件里的数据
DocumentBuilderFactory ddf = DocumentBuilderFactory.newInstance(); try { //第二步通过解析器工厂对象dbf创建解析器对象 DocumentBuilder db= ddf.newDocumentBuilder(); //第三步:通过解析器对象调用的方法将XML文件转换为Document对象 Document document = db.parse("收藏信息.xml"); System.out.println(document); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
//定义得到Dcoument方法 public Document getDocument(String uri){ Document document=null; try { //创建解析器工厂对象 DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance(); //通过解析器工厂独享创建解析器对象 DocumentBuilder db = dbf.newDocumentBuilder(); document = db.parse(uri); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return document; } //测试类 public static void main(String[] args) { //创建XmlDocumentDemo02类对象 XmlDocumentDemo02 xdd = new XmlDocumentDemo02(); //调用getDocument()方法将"收藏信息.xml"文件转换为Document对象 Document document = xdd.getDocument("收藏信息.xml"); //获取数据 NodeList brands =document.getElementsByTagName("Brand"); for (int i = 0; i < brands.getLength(); i++) {// getLength()列表中的节点数。 //Node是一个节点口,节点口包括元素节点,属性节点,文本节点等,而现在我们获取的是brand的节点,所以需要类型转换 Node node = brands.item(i);// 返回集合中的第 index 个项。 Element brand = (Element)node; String value = brand.getAttribute("name");//通过元素节点的属性名称获取属性的值 System.out.println(value); } }
保存XML文件:
步骤:1.获得TransformerFactory对象
2.创建Transformer对象
3.创建DOMSource对象:包含XML信息
4.设置输出属性:编码格式
5.创建StreamResult对象:包含保存文件信息
6.将XML保存到指定文件中
//保存XML文件:将java内存中的document对象存储到外部中,需要借助转换器对象实现此功能 public void savaXML(String path){ //创建转换器工厂对象 TransformerFactory factory=TransformerFactory.newInstance(); //设置首行缩进4个字符 允许用户设置底层实现上的指定属性。 factory.setAttribute("indent-number", "4"); try { //通过转换器工厂对象创建转换器对象 Transformer transformer=factory.newTransformer(); //设置存储格式 设置转换中实际的输出属性。 transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 创建transform()方法需要的两个参数对象 StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312")); DOMSource source=new DOMSource(document); /* * 通过转换器对象调用方法将java内存中的document对象存储到外部文件中 * transform(Source source,Result result)两个参数 * Source表示源头,也就是Java内存中的document对象,而Source是一个接口,不能被直接创建对象,可以使用其实现类DOMSource * Result表示结果,也就是java内存中的document对象要存储的位置,而Result是一个接口,不能直接创建对象,可以使用其实现类StreamReault */ transformer.transform(source, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }
获取标签和属性:
document.getElementsByTagName("Brand");
获取标签节点
getLength():获取节点集合元素个数
brands.item(i);
item()方法将元素从集合中取出来
eleBrand.getAttribute("name")
调用方法获取属性的值
getChildNodes()
获取子节点的方法
getNodeType()
获取子节点的类型的值
//获取手机品牌和属性 public void showInfo(){ //从document对象出发,调用方法获取节点,根据标签的名称来获取节点,获取的可能是多个节点,所以得到的是一个节点的集合 NodeList brands=document.getElementsByTagName("Brand"); //遍历节点集合,取出里面的元素,getLength():获取节点集合元素个数 for(int i=0;i<brands.getLength();i++){ //item()方法:将元素从集合中取出来,取出来的是父类型Node Node node=brands.item(i); //将父类型向下转型为真正的类型,Brand是一个标签节点,所以向下转型为Element Element eleBrand=(Element)node; //得到标签节点后,调用方法获取指定属性的属性的值 System.out.println(eleBrand.getAttribute("name")); //获取Brand标签的子节点,可能有多个不同类型的子节点,将获取的子节点存储在节点集合中 getChildNodes():获取子节点的方法 NodeList types=eleBrand.getChildNodes(); //遍历子节点的集合 for(int j=0;j<types.getLength();j++){ //从集合中取出子节点 Node typeNode=types.item(j); //从集合中取出来的子类中类型可能是文本节点,也可能是标签节点,所以在进行类型判断,getNodeType()获取节点的类型值,是一个short值,Node里面给不同类型的节点赋予了一个静态常量值,其中Element类型节点的值为1 if(typeNode.getNodeType()==Node.ELEMENT_NODE){ //将父节点向下转型为子节点类型 Element eleType=(Element)typeNode; //通过字节点调用方法获取执行属性的属性值 通过元素节点的属性名称获取属性的值 System.out.println(eleType.getAttribute("name")); } } } }
添加元素到XML中:
createElement(String tagName)
调用此方法创建一个元素的节点
setAttribute(String name,String value)
调用此方法设置属性及属性的值
appendChild(Node newChild)
将创建好的两个元素节点建立关系
getElementsByTagName(String tagname).item(index).appendChild(Node newChild)
获取XML文件中第一个元素节点,将创建好的标签作为子节点追加到获取的第一个元素节点中
this.savaXML(String path)
元素添加完毕之后调用保存方法将对象信息存储到xml文件中
//添加元素到XML文件中 public void add(){ //通过document对象调用方法创建一个元素的节点 Element element=document.createElement("Brand"); //通过元素节点调用方法给元素节点设置属性及属性值 element.setAttribute("name", "三星"); //通过document对象调用方法创建一个元素的节点 Element ele1=document.createElement("Type"); //通过元素节点调用方法给元素节点设置属性及属性值 ele1.setAttribute("name", "Note3"); //将创建好的两个节点建立关系 element.appendChild(ele1); //获取xml文件中的第一个PhoneInfo元素节点,然后将创建好的brand标签作为子节点追加到获取的第一个PhoneInfo元素节点中 document.getElementsByTagName("PhoneInfo").item(0).appendChild(element); //元素添加完毕之后,需要将java内存中的document对象存储到xml文件中 this.savaXML("new.xml"); }
修改XML文件的内容:
getElementsByTagName(String tagname)
获取你想要修改的元素标签
setAttribute(String name,String value)
添加属性
//修改:修改xml文件中的内容 public void update(){ //通过document对象获取你想要修改的元素,将获取的元素存储在节点集合中 NodeList brands=document.getElementsByTagName("Brand"); //遍历节点集合,修改节点(给节点添加一个属性) for(int i=0;i<brands.getLength();i++){ //取出节点集合中的元素 Node brand=brands.item(i); //将节点元素转换成其真正的类型 Element eleBrand=(Element)brand; //给元素节点添加了一个新的属性 eleBrand.setAttribute("id", i+""); } this.savaXML("new.xml"); }
删除XML文件中标签:
getParentNode():
获取父节点
removeChild(元素节点名)
删除子节点
//删除XMl文件中一些标签 public void delete(){ //通过document对象获取你想要的删除的元素节点,将元素节点存储在节点集合中 NodeList brands=document.getElementsByTagName("Brand"); //遍历集合 for(int i=0;i<brands.getLength();i++){ //取出节点集合中的元素 Node brand=brands.item(i); //将节点转换成真正的类型 Element eleBrand=(Element)brand; //从遍历的元素节点中找出你要删出的元素节点,通过元素节点的属性值来判断 if(eleBrand.getAttribute("name").equals("华为")){ //删除元素,不能自己删除自己,需要通过其父元素来删除 getParentNode():获取父节点 removeChild(元素节点名):删除子节点 //getParentNode()返回此节点的父节点。 eleBrand.getParentNode().removeChild(eleBrand); } } this.savaXML("new.xml"); }
DOM4J
非常优秀的java XML API
性能非常优异,功能强大
开放源代码
Document:定义XML文档
Element:定义XML元素
Text:定义XML文本节点
Attribute:定义了XML的属性
解析XML文件 :
SAXReader saxReader = new SAXReader();
创建对象,调用read()方法将XML文件转换成Document对象
.read(File file)
得到Document对象
//定义方法:将XML文件转换为Document类对象 public static void loadDocument(){ try{ //创建SAXReader类对象,调用方法read()方法将XML文件转换为Document类对象 SAXReader saxReader = new SAXReader(); //利用saxReader.read(File file)方来得到Document对象 doc = saxReader.read(new File("收藏信息.xml")); }catch (Exception e) { e.printStackTrace(); } }
获取标签和属性
.getRootElement()
获取根节点
.elementIterator()
获取根节点所有的子节点(子元素)
attributeValue(属性名:)
输出标签的属性
//获取标签和属性 public static void showPhoneInfo() { // 获取XML的根节点 Element root = doc.getRootElement(); // 通过根节点调用elementIterator()方法获取根节点的所有子元素Brand,将获取的brand标签存储在迭代器总,然后遍历所有的Brand标签 for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) { Element brand = (Element) itBrand.next(); // attributeValue(属性名:)输出标签的属性 System.out.println("品牌:" + brand.attributeValue("name")); // 使用bread节点来调用elementIterator()方法获取bread标签的子标签type,然后遍历Type标签 for (Iterator itType = brand.elementIterator(); itType.hasNext();) { Element type = (Element) itType.next(); //attributeValue(属性名:)输出标签的属性 System.out.println("\t型号:" + type.attributeValue("name")); } } }
保存XML文件
OutputFormat.createPrettyPrint()
来获取存储的格式和编码
setEncoding("GBK")
获取XML编码
//保存xml信息 public static void saveXML(String path){ try { //OutputFormat.createPrettyPrint()来获取存储的格式和编码 OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); // 指定XML编码 //写入Xml文档中获取文件的路径和编码 XMLWriter writer = new XMLWriter(new FileWriter(path), format); writer.write(doc); writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
添加标签:
.addElement(String age0);
创建子节点标签
addAttribute(String age0, String age1)
创建标签属性
//添加标签 public static void addNewPhoneInfo(){ // 获取XML的根节点 Element root = doc.getRootElement(); // 利用根节点创建Brand标签 Element el = root.addElement("Brand"); // 给Brand标签设置属性 el.addAttribute("name", "三星"); // 利用Brand节点创建Type标签 Element typeEl = el.addElement("Type"); // 给Type标签设置属性 typeEl.addAttribute("name", "Note4"); saveXML("收藏信息.xml"); }
修改XML文件内容
addAttribute(String age0, String age1)
方法传入数据
/修改XML文件的内容 public static void updatePhoneInfo(){ // 获取XML的根节点 Element root = doc.getRootElement(); int id = 0;//定义准备添加的属性 //通过根节点调用elementIterator()方法获取根节点的所有子元素Brand,将获取的brand标签存储在迭代器中,然后遍历所有的Brand标签 for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) { //迭代器中取出 Element brand = (Element) itBrand.next(); id++; //调用addAttribute()方法传入数据进行修改 brand.addAttribute("id", id + ""); } saveXML("src/收藏信息.xml"); }
删除标签
attributeValue(String age0)
得到你要删除的标签
remove(Element age0)
删除
//删除标签 public static void deleteItem(){ // 获取XML的根节点 Element root = doc.getRootElement(); int id = 0; //通过根节点调用elementIterator()方法来获取根节点中所有的Brand元素,将获取的brand标签存储到迭代器中,然后开始遍历Brand标签 for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) { Element brand = (Element) itBrand.next(); //从brand标签中寻找你要删除的标签attributeValue()方法的到你需要删除的标签 if (brand.attributeValue("name").equals("华为")) { //自己不能删除自己,需要找到其父类元素进行删除 brand.getParent().remove(brand); } } saveXML("src/收藏信息.xml"); }