java XML

1、XML:可拓展标记语言。用来描述生活中大量数据之间的关系

例如:<a>

                    <b>

                            <d></d>

                    </b>

                   <c>

                  </c>

            </a>

关系:a下面有bc,b下面有d.


2、XML语法:文档声明

<?xml  version="1.0"  encoding="UTF-8"  standalone="yes" ?>

version:版本号

encoding:编码格式

standalone:是否独立

(1)元素:标签,命名规范

(2)属性

(3)注释:注释不能再文档声明之前。
(4)<![CDATA[内容]]>:cdata区,直接显示内容,不进行解析。

(5)命令:<?xml-stylesheet  type="text/css"  herf="01.css"?>


3、XML约束:dtd

<!ELEMENT 书架 (书+)>

<!ELEMENT 书 (书名,作者)>

<!ELEMENT 书名 (#PCDATA)>

<!ELEMENT 作者 (#PCDATA)>


DOCTYPE : 声明所遵循的DTD文件

<!DOCTYPE 书架 SYSTEM "文件名" >


<!ELEMENT 元素  元素(any enpty)类型或者内容>


<!ATTLIST  元素名

    属性名   属性类型(CDATA、枚举、ID:设置属性为唯一值、ENTITY:实体)   设置说明(REQUIERD:必须的、IMPLIED:可选的、FIXED:固定的、默认值)>


引用实体:XML文档所用的(<!ENTITY  copy  "nihaoya">    -->&copy)

参数实体:用在DTD中(<!ENTITY  %  copy  "nisdlk">    -->  %  copy)


4、XML解析

(1)解析方式分为dom和sax

(2)调整jvm内存大小:点击项目的run configuration

(3)jaxp对XML进行dom解析:

     A、读取XML所有节点

@Test
    public void read() throws Exception{
        //获取工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //得到dom解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //获得文档
        Document doc = builder.parse("src/book.xml");

        Node node1 = doc.getElementsByTagName("书架").item(0);//获取书架标签

        list(node1);
    }

    private void list(Node node1) {
        if(node1 instanceof Element){
            System.out.println(node1.getNodeName());
        }
        NodeList list1 = node1.getChildNodes();
        for(int i=0;i<list1.getLength();i++){
            list(list1.item(i));
        }

    }

B、添加节点

@Test
    public void add() throws Exception{

        //获取工程
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //得到dom解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //获得文档
        Document doc = builder.parse("src/book.xml");

        Element element = doc.createElement("售价");
        element.setAttribute("nihao", "shiwo");
        element.setTextContent("bbb");
        
        Node node = doc.getElementsByTagName("书").item(0);
        node.appendChild(element);
        //node.insertBefore(newChild, refChild)
        
        //写回文档
        TransformerFactory tffactory = TransformerFactory.newInstance();
        Transformer trans =  tffactory.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/book.xml")));
    }

C、删除节点

@Test
    public void delete() throws Exception{

        //获取工程
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //得到dom解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //获得文档
        Document doc = builder.parse("src/book.xml");

        Element ele = (Element) doc.getElementsByTagName("售价").item(0);
        ele.getParentNode().removeChild(ele);
        
        //写回文档
        TransformerFactory tffactory = TransformerFactory.newInstance();
        Transformer trans =  tffactory.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/book.xml")));
    }

(4)jaxp对XML文档进行sax解析

A、获取XML文档内容

@Test
    public void test01() throws Exception{
        //获取解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //获取解析器
        SAXParser parser = factory.newSAXParser();
        //获取读取器
        XMLReader reader = parser.getXMLReader();
        //设置内容读取器
        reader.setContentHandler(new XMLHandler());
        //读取XML文档
        reader.parse("src/book.xml");
    }

//获取所有标签

class XMLHandler extends DefaultHandler{
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("<"+qName+">");
        for(int i = 0;attributes!=null&&i<attributes.getLength();i++){
            System.out.println(attributes.getQName(i)+"="+attributes.getValue(i));
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("</"+qName+">");
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        System.out.println(new String(ch,start,length));
    }

}


//获取特定的标签的处理器
class TagHandler extends DefaultHandler{

    private String current_tag;

    private int num=2;

    private int currentNum;

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        current_tag= qName;

        if("作者".equals(current_tag)){
            currentNum++;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        current_tag=null;
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if("作者".equals(current_tag)&&currentNum==num){
            System.out.println(new String(ch,start,length));
        }
    }

}


//解析JavaBean的处理器

class BeanHandler extends DefaultHandler{

    private List<Book> list =new ArrayList<Book>();
    private String current_tag;
    private Book book1;
    public List<Book> getList() {
        return list;
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        current_tag=qName;
        if("书".equals(current_tag)){
             book1 = new Book();
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub    
        if("书".equals(qName)){
            list.add(book1);
            book1=null;
        }
        current_tag=null;
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
 
        if("书名".equals(current_tag)){
            book1.setName(new String(ch,start,length));
        }
        if("作者".equals(current_tag)){
            book1.setAuthor(new String(ch,start,length));
        }
        if("价格".equals(current_tag)){
            book1.setPrice(new String(ch,start,length));
        }
    }

}


(5)dom4j对XML进行解析:需要导入包

A、读取文档的指定标签

@Test
    public void read() throws Exception{
        //读取器
        SAXReader reader = new SAXReader();
        //获取文档
        Document document = reader.read("src/book.xml");
        //获取根节点
        Element ele = document.getRootElement();
        //获取根节点下面的元素
        Element book = (Element) ele.elements("书").get(1);
        //获取需要的内容
        String value = book.element("书名").getText();
        System.out.println(value);
    }

B、添加结点

@Test
    public void add() throws Exception{

        SAXReader reader = new SAXReader();
        Document doc = reader.read("src/book.xml");

        Element ele = doc.getRootElement();
        Element book = ele.element("书");
        book.addElement("售价").addAttribute("aaa", "bbbb").addText("2002");

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        
        //写回
        XMLWriter writer = new XMLWriter( new FileOutputStream( "src/book.xml" ), format );
        writer.write( doc );
        writer.close();
    }


(6)XPath

得到特定的书名下的内容,查看文档

@Test
    public void test01() throws Exception{
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("src/book.xml"));
        
        String value = doc.selectSingleNode("//书名").getText();
        System.out.println(value);
    }


(7)schema

查看w3c文档


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值