zoukankan      html  css  js  c++  java
  • xml和xml解析

    1.简介XML

    XML 可扩展标记语言,传输数据

    HTML超文本标记语言,显示数据

    XML 文档声明  只能放在第一行,注释不能放在声明之前

        <?xml version="1.0" encoding="UTF-8" standalone="no"?>  standalone表示文档是否依赖其他文档。

    XML元素:xml标签,必须有且仅有一个根标签,元素中的属性不能重复,属性名称可以当做子标签去定义

      

        

    xml中不会忽略主体内容出现的空格和换行
    //从元素集合内找到第一个子元素
    Element name = (Element)linkman.getFirstChild();

     特殊字符

    CDATA区  解析器不会对CDATA区中的内容进行解析,直接原样输出。

      <![CDATA[数据内容]]>

      

    2.XML约束    dtd 约束与 schema约束

     约束的好处:可以去规范我们的xml标签(根据自己的要求)可以在工具上有相应的提示;

      dtd与schema的区别:

         dtd没有人约束它,容易写错,功能简单;

              Schema:Schema本身是xml文件,有相应的标签约束它,功能更加强大;

      

    3.DOM模型(文档对象模型)  

    对象:

    Document(文档),Element(标签元素),Text(文本对象), Attribute(属性对象)

    一切皆节点,所有的对象都是Node对象,所以对象之间都是有关系的;

    我们使用反射的开端是得到class,而对于XML的解析,一切的开始都要找到document对象;

    4.原生API解析XML       使用Java提供的API去解析XML  -----    JAXP  (Java   API  for XML)

    解析XML--其实就是对XML进行增删改查,  它将xml文档中的所有内容读取出来,然后进行封装并放在内存里面..

    我们去拿它,去修改他都是去操作的内存中的数据;使用TransFormer类 把 内存中的数据 同步到xml里面去

    xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE contacts SYSTEM "contacts.dtd">
    <contacts>
    	<linkman>
    		<name>gg</name>
    		<email>gg@itsource.cn</email>
    		<address>成都</address>
    		<group>源代码教育</group>
    	</linkman>
    	<linkman>
    		<name>mm</name>
    		<email>lanyotech@qq.com</email>
    		<address>成都</address>
    		<group>源代码教育</group>
    	</linkman>
    </contacts>
    

      

    package TestJAXP;
    
    import java.io.File;
    import java.io.IOException;
    
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.Result;
    import javax.xml.transform.Source;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.TransformerFactoryConfigurationError;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.junit.Test;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    public class TestJAXP {
    	
    /*取出第二个联系人的名字*/
    	@Test
    	public void select() throws SAXException, IOException, ParserConfigurationException {
    		File file = new File("F:\workspace\TestXml\src\TestJAXP\contacts.xml");
    		//1. 获得dom 对象,并拿到根元素
    		Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
    		Element root = dom.getDocumentElement();
    		//2.通过标签名拿到根节点的该多个子元素,并拿到第二个linkman.
    		NodeList linkmans = root.getElementsByTagName("linkman");
    		Element  linkman2 = (Element) linkmans.item(1);
    		//3.拿到第二联系人所有name元素
    		NodeList names = linkman2.getElementsByTagName("name");
    		Element name =  (Element) names.item(0);  //(效果一样) Node name =  names.item(0);
    		//5.拿到name中的文本值
    		String nameText = name.getTextContent();
    		System.out.println(nameText);
    	}
    	
    /*增加一个联系人信息*/
    	@Test
    	public void add() throws Exception{
    		File file = new File("F:\workspace\TestXml\src\TestJAXP\contacts.xml");
    		//1. 获得dom 对象,并拿到根元素。
    		Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
    		Element root = dom.getDocumentElement();
    		//2.创建一个linkman子元素,并将其放入根节点中。
    		Element linkman = dom.createElement("linkman");
    		root.appendChild(linkman);
    		//3.为创建的标签添加元素
    		Element name  = dom.createElement("name");
    		name.setTextContent("李四");
    		linkman.appendChild(name);
    		Element email  = dom.createElement("email");
    		email.setTextContent("11@163.com");
    		linkman.appendChild(email);
    		Element adress  = dom.createElement("adress");
    		adress.setTextContent("北京");
    		linkman.appendChild(adress);
    		Element group  = dom.createElement("group");
    		group.setTextContent("中国");
    		linkman.appendChild(group);
    		
    		//4. 对内存中修改的数据,同步到磁盘的XML文件中
    	//获取Transformer转换器对象,得先拿到同步的对象工厂--TransformerFactory.newInstance()
    		Transformer trant = TransformerFactory.newInstance().newTransformer();
    	//创建Source对象(绑定doc对象)--拿到内存中的数据     和      Result对象(绑定文件对象)--拿到磁盘上的文件 
    		Source xmlSource = new DOMSource(dom);
    		Result outputTarget = new StreamResult(file);
    		trant.transform(xmlSource, outputTarget);
    	}
    	
    /*删除第三个联系人*/
    	@Test
    	public void delete() throws Exception{
    		File file = new File("F:\workspace\TestXml\src\TestJAXP\contacts.xml");
    		//1. 获得dom 对象,并拿到根元素。
    		Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
    		Element root = dom.getDocumentElement();
    		//2.拿到第三个linkman。
    		Element linkman3 = (Element) dom.getElementsByTagName("linkman").item(2);
    		//3. 通过其父元素干掉他
    		linkman3.getParentNode().removeChild(linkman3);
    		//4.同步
    		Transformer trant = TransformerFactory.newInstance().newTransformer();
    		Source xmlSource = new DOMSource(dom);
    		Result outputTarget = new StreamResult(file);
    		trant.transform(xmlSource, outputTarget);
    	}
    	
    /*修改第一个联系人的邮箱*/
    	@Test
    	public void modify() throws Exception{
    		File file = new File("F:\workspace\TestXml\src\TestJAXP\contacts.xml");
    		//1. 获得dom 对象,并拿到根元素。
    		Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
    		Element root = dom.getDocumentElement();
    		//2.拿到第一个linkman 元素
    		Element linkman1 = (Element) root.getElementsByTagName("linkman").item(0);
    		//3.拿到第一个linkman元素的 email元素,并修改值。
    		Element email = (Element) linkman1.getElementsByTagName("email").item(0);
    		email.setTextContent("8888@qq.com");
    		//4.同步
    		Transformer trant = TransformerFactory.newInstance().newTransformer();
    		Source xmlSource = new DOMSource(dom);
    		Result outputTarget = new StreamResult(file);
    		trant.transform(xmlSource, outputTarget);
    	}
    }
    

      

    5. 使用Dom4J进行解析xml

      

    package TestDOM4J;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    import org.junit.Test;
    
    
    
    public class testDOM4J {
    	
    /* 获取第二联系人的名字*/
    	@Test
    	public void select() throws Exception {
    		//1.通过Dom4J获取dom 对象
    		SAXReader reader = new SAXReader();
    		Document doc = reader.read(new File("F:\workspace\TestXml\src\TestDOM4J\contacts.xml"));
    		System.out.println(doc);
    		//2.获得根节点
    		Element root = doc.getRootElement();
    		//3.拿到linkman,并获取第二个linkman
    		List<Element> linkmans = root.elements("linkman");
    		Element linkman2 = linkmans.get(1);

              //4.拿到linkman2的name对象
              Element name = linkman2.element("name");
              String str = name.getText();
              System.out.println(str);

    	}
    /* 增加一个联系人*/
    	@Test
    	public void add() throws Exception {
    		//1.通过Dom4J获取dom 对象
    		File file = new File("F:\workspace\TestXml\src\TestDOM4J\contacts.xml");
    		SAXReader reader = new SAXReader();
    		Document doc = reader.read(file);
    		//2.获得根节点
    		Element root = doc.getRootElement();
    		//3.直接给元素添加节点,设置值
    		Element linkman = root.addElement("linkman");
    		linkman.addElement("name").setText("张三");
    		linkman.addElement("email").setText("1434314.@qq.com");
    		linkman.addElement("adress").setText("上海奉贤");
    		linkman.addElement("group").setText("中国");	
    		//4.把修改后的内存中数据 存储到 硬盘xml 文件中,(同步,一定要关闭流)
    		FileWriter fw = new FileWriter(file);
    		//使用新的格式输出
    		OutputFormat of = OutputFormat.createPrettyPrint();
    		XMLWriter xw = new XMLWriter(fw, of);
    		xw.write(doc);
    		xw.close();
    		fw.close();
    	}
    	
    /*删除第三个联系人信息*/
    	@Test
    	public void delete() throws Exception{
    		File file = new File("F:\workspace\TestXml\src\TestDOM4J\contacts.xml");
    		Document doc = new SAXReader().read(file);
    		Element root = doc.getRootElement();
    		//拿到第三个linkman
    		Element linkman3 = (Element)root.elements("linkman").get(2);
    		//删除元素 ,同步
    		linkman3.getParent().remove(linkman3);
    		FileWriter fw = new FileWriter(file);
    		doc.write(fw);
    		fw.close();
    	}
    	
    /*修改第一个联系人的邮箱*/
    	@Test
    	public void modify() throws Exception{
    		File file = new File("F:\workspace\TestXml\src\TestDOM4J\contacts.xml");
    		Document doc = new SAXReader().read(file);
    		Element root = doc.getRootElement();
    		//获得第一联系人的邮箱
    		Element linkman1 = (Element)root.elements("linkman").get(0);
    		Element email = linkman1.element("email");
    		email.setText("1633333@163.com");
    		//同步
    		FileWriter fw = new FileWriter(file);
    		doc.write(fw);
    		fw.close();
    	}
    }
    

      

  • 相关阅读:
    二叉排序树
    索引顺序表查找(分块查找)
    wpf中的窗口
    递归算法以及汉诺塔
    Net中资源存储的设置
    AutoResetEvent 和ManualResetEvent
    WPF:跨应用程序会话保持和还原应用程序范围的属性
    Base64编码及其作用
    WPF中的应用程序级别Application
    Ajax经典学习教材,IBM官方Ajax教材
  • 原文地址:https://www.cnblogs.com/gshao/p/10285345.html
Copyright © 2011-2022 走看看