XML学习小笔记

XML学习小笔记,第1张

XML XML定义

​ XML(Extensible Markup Language 可扩展标记语言),XML是一个以文本来描述数据的文档。


XML的用途

(1) 充当显示数据(以XML充当显示层)

(2) 存储数据(存储层)的功能

(3)以XML描述数据,并在联系服务器与系统的其余部分之间传递。


从某种角度讲:XML是数据封装和消息传递技术。


SAX解析XML
  • SAX的了解

  • SAX *** 作

    继承DefaultHandler

    package XML_Example;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    import java.util.ArrayList;
    import java.util.List;
    
    public class personHandler extends DefaultHandler {
        private List<person> persons=null;
        private person p;   //当前正在解析的person对象
        private String tag; //用于记录当前正在解析的标签
    
        public List<person> getPersons() {
            return persons;
        }
        //开始解析文档时调用
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            //初始化集合
            persons=new ArrayList<>();
            System.out.println("开始解析》》》》》》");
        }
        //XML解析完结束
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
    
            System.out.println("解析结束??????");
        }
        //解析开始元素时调用
        //uri  命名空间
        //localName  不带前缀的标签名
        //qName   带前缀的标签名
        //attributes 当前标签的属性集合
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            if ("person".equals(qName)) {
                 p=new person();
                 String personid=attributes.getValue("personid");
                 p.setPersonid(personid);
            }
            tag=qName;
        }
        //解析结束元素时调用
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            if ("person".equals(qName)){
                persons.add(p);
            }
            tag=null;
        }
        //解析文本内容时调用
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            if (tag!=null){
                if ("name".equals(tag)){
                    p.setName(new String(ch,start,length));
                } else if ("address".equals(tag)) {
                    p.setAddress(new String(ch,start,length));
                } else if ("tel".equals(tag)) {
                    p.setTel(new String(ch,start,length));
                } else if ("fax".equals(tag)){
                    p.setFax(new String(ch,start,length));
                } else if ("email".equals(tag)) {
                    p.setEmail(new String(ch,start,length));
                }
            }
        }
    }
    
    

    *** 作XML

     public  void saxParseXML() throws ParserConfigurationException, SAXException, IOException {
            //创建一个sax解析器工厂对象
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            //通过工厂对象创建sax解析器
            SAXParser saxParser = saxParserFactory.newSAXParser();
            //创建一个数据处理器(需要自己写)
            personHandler personHandler = new personHandler();
            //开始解析
            InputStream is = Thread.currentThread()
                    .getContextClassLoader().getResourceAsStream("XML_Example/people.xml");
            saxParser.parse(is,personHandler);
            List<person> persons = personHandler.getPersons();
            for (person p:persons) {
                System.out.println(p);
            }
        }
    
  • SAX解析的特点

    1.基于事件驱动

    2.顺序读取,速度快

    3.不能任意读取节点(灵活性低)

    4.解析时占用的内存小

    5.SAX更适用于在性能更高的设备上使用(Android开水中)

DOM解析XML
  • DOM:Document Object Model(文档对象模型)

  • DOM的特性:

    定义一组java接口,基于对象,与语言和平台无关将XML文档表示为树,在内存中解析和存储XML文档,允许随机访问文档的不同部分。


  • DOM解析XML

    DOM的优点:由于树在内存中是持久的,因此可以修改后更新,它还可以在任何时候在树中上下导航,API使用起来也较简单。


  • DOM解析的特点

    1.基于树型结构,通过解析器一次性将文档加载到内存中,所以会比较占内存,可以随机访问,更灵活,更适合在web开发中使用。


  • DOM的 *** 作实例

    public void DomParseXML() throws ParserConfigurationException, IOException, SAXException {
            //创建一个DOM解析器工厂对象
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            //通过工厂对象创建解析器对象
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            //解析文档(将所有东西读到内存)
            InputStream is = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("XML_Example/people.xml");
            //此代码完成后,整个XML文档1已经被加载到内存中,以树状形式存储
            Document doc = documentBuilder.parse(is);
            //从内存中读取数据
            //获取结点名称为person的所有结点,返回结点集合
            NodeList person1 = doc.getElementsByTagName("person");
            ArrayList<person> persons = new ArrayList<>();
    
            person p=null;
            for (int i = 0; i < person1.getLength(); i++) {
                Node item = person1.item(i);
                p=new person();
                //获取节点的属性值
                String personid = item.getAttributes().getNamedItem("personid").getNodeValue();
                p.setPersonid(personid);
                //获取当前节点的所有子节点
                NodeList childNodes = item.getChildNodes();
                for (int j = 0; j < childNodes.getLength(); j++) {
                    Node item1 = childNodes.item(j);
                    String nodeName = item1.getNodeName();
                    if ("name".equals(nodeName)){
                        p.setName(item1.getFirstChild().getNodeValue());
                    }else if("address".equals(nodeName)){
                        p.setAddress(item1.getFirstChild().getNodeValue());
                    }else if ("tel".equals(nodeName)){
                        p.setTel(item1.getFirstChild().getNodeValue());
                    }else if ("fax".equals(nodeName)){
                        p.setFax(item1.getFirstChild().getNodeValue());
                    }else if ("email".equals(nodeName)){
                        p.setEmail(item1.getFirstChild().getNodeValue());
                    }
                }
                persons.add(p);
            }
    
            System.out.println("打印结果:");
            for (person a:persons) {
                System.out.println(a);
    
            }
    //        //第二种方式
    //        System.out.println(Arrays.toString(persons.toArray()));
    
        }
    
JDOM解析XML DOM4J解析XML 通过对象生成XML文件

XMLEncoder实例
public void xmlEnCoder() throws FileNotFoundException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.xml"));
        XMLEncoder xmlEncoder = new XMLEncoder(bos);
        person p=new person();
        p.setPersonid("121212");
        p.setAddress("b北京");
        p.setName("小明");
        p.setEmail("[email protected]");
        p.setFax("132132");
        p.setTel("18251212");
        xmlEncoder.writeObject(p);
        xmlEncoder.close();
        System.out.println("完成");
    }
XMLDecoder实例
 public void xmlDeCoder() throws FileNotFoundException {
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("test.xml"));
        XMLDecoder xmlDecoder = new XMLDecoder(bufferedInputStream);
        person o =(person) xmlDecoder.readObject();
        System.out.println(o);
    }
实例中的XML和person类
package XML_Example;

public class person {
    private String personid;
    private String name;
    private String address;
    private String tel;
    private String fax;
    private String email;
    public String getPersonid() {
        return personid;
    }
    public void setPersonid(String personid) {
        this.personid = personid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getFax() {
        return fax;
    }
    public void setFax(String fax) {
        this.fax = fax;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "person{" +
                "personid='" + personid + '\'' +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", tel='" + tel + '\'' +
                ", fax='" + fax + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

JSON了解

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/584485.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存