dom4j生成解析XML

xml的书写格式

如果不定义XML的书写格式,你可以任意的去书写。只需要保证

  1. 1.所有元素都写在根元素下面
  2. 2.Xml的声明信息<?xml version="1.0" encoding="utf-8"?>(甚至可以不写)

效果如下
以下所有示例都是用该XML

<?xml version="1.0" encoding="utf-8"?><!--声明信息-->
<!--引入外部dtd文件-->
<!DOCTYPE books SYSTEM "book.dtd">
<!-- 根元素-->
<books>
    <book id="b1">
        <name>java</name>
        <author>王迅</author>
        <price>30</price>
    </book>
    <book id="b2">
        <name>python</name>
        <author>历战</author>
        <price>45</price>
    </book>
</books>

但是如实不去规定XML的结构,xml就会过于灵活,过于杂乱,以至于很难去读取信息。所以我们这里使用dtd(Document Type Definition)来对XML进行限制。

DTD格式(Document Type Definition)

从上面XML有元素和属性 ,所以我们们做的就是对元素和属性进行定义

1.元素

1.1

  • <!ELEMENT 元素名(子节点[节点个数]) >
  <!--定义根元素 +代表必须有一个或多个子元素 ?代表有零个或一个 *代表任意多个 -->

        <!ELEMENT books (book+)>

1.2
<!ELEMENT 元素名(#PCDATA)>
其中#PCDATA表示标签中的内容为文本 而非其他标签

  <!ELEMENT name (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    <!ELEMENT price (#PCDATA)>

2.属性

<!ATTLIST 元素名称 属性名称 属性类型 默认值>
在这里插入图片描述

  <!--attlist 为设置元素的属性 CDATA 代表为字符类型  #REQUIRED代表必须填写 #IMPLIED为可选  -->

        <!ATTLIST book id CDATA #REQUIRED>

3.例子

<?xml version="1.0" encoding="utf-8"?>

        <!--定义根元素 +代表必须有一个或多个子元素 ?代表有零个或一个 *代表任意多个 -->

        <!ELEMENT books (book+)>

        <!--定义book节点下的元素-->

        <!ELEMENT book (name,author,price) >

        <!--attlist 为设置元素的属性 CDATA 代表为字符类型  #REQUIRED代表必须填写 #IMPLIED为可选  -->

        <!ATTLIST book id CDATA #REQUIRED>

        <!--其中#PCDATA表示标签中的内容为文本 而非其他标签-->

        <!ELEMENT name (#PCDATA)>
        <!ELEMENT author (#PCDATA)>
        <!ELEMENT price (#PCDATA)>

dom4j生成解析

思路:
1.获取document,对document进行操作来生成或获取元素和属性
2.一切元素来源于根节点,所以要先获取根节点,然后通过链式编程,来获取对象,同一级别的对象可通过遍历来得出

1.解析xml

  1. 创建dom4j对象 SAXReader
  2. 通过SAXReader去获取XML文件,生成document对象
  3. 分别去get元素和属性
public class test_dom4j {
    public static void main(String[] args) throws MalformedURLException, DocumentException {
//        创建dom4j对象
        SAXReader saxReader = new SAXReader();
//        读取xml文件
        Document document = saxReader.read(new File("src/xml_test/book.xml"));
//        获取根节点
        Element rootElement = document.getRootElement();
//        获取迭代器 遍历根节点元素
        Iterator<Element> iterator = rootElement.elementIterator();
        while(iterator.hasNext()){
//            获得元素
            Element e = iterator.next();
            System.out.println(e.getName());
//            遍历元素
//            遍历id属性
            Iterator<Attribute> attribute = e.attributeIterator();
           while (attribute.hasNext()){
                Attribute Attribute = attribute.next();
                System.out.println(Attribute.getName()+"  "+Attribute.getText());
            }
//            遍历子元素

            Iterator<Element> iterator1 = e.elementIterator();
            while (iterator1.hasNext()){
                Element element = iterator1.next();
                System.out.println(element.getName()+"  "+element.getText());
            }
            System.out.println("----------------------------------------------");
        }
    }
}

2.动态生成XML

  1. 通过DocumentHelper.createDocument()来创建document对象
  2. 对document添加元素和属性
  3. 输出
//在程序中创建XML并输出到文件中
public class Writr4Xml {
    public static void main(String[] args) throws Exception {
//        创建Document对象
        Document document = DocumentHelper.createDocument();
//        创建根元素
        Element books = document.addElement("books");
//        为根元素创建子元素1
        Element book1 = books.addElement("book");
//        为子元素1添加属性
        book1.addAttribute("id","b1");
//        为子元素1添加元素
        Element name1 = book1.addElement("name");
        Element author1 = book1.addElement("author");
        Element price1 = book1.addElement("price");
//        为根元素创建子元素2
        Element book2 = books.addElement("book");
        book2.addAttribute("id","b2");
        //        为子元素2添加元素
        Element name2 = book2.addElement("name");
        Element author2 = book2.addElement("author");
        Element price2 = book2.addElement("price");

//        为元素赋值
        name1.addText("JAVA");
        author1.addText("小黑");
        price1.addText("100");

        name2.addText("python");
        author2.addText("小龙");
        price2.addText("550");


//        将XML输出到文件中
//        设置输出格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileWriter(new File("src/xml_test/stream.xml")), format);
//        将XML输出
        xmlWriter.write(document);
        xmlWriter.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值