XML编程

XML基础(Extensive Markup Language)

XML是什么:

  • 可扩展的标记语言

XML能干什么:

  • 描述数据、存储数据、传输(交换)数据。

  XML文档节点类型

  • 文档(document)
  • 元素(element)
  • 属性(attribute)
  • 文本(PCDATA--parsed character data)
  • 注释(comment)
  • DOCTYPE :主要验证文档内容的正确性
  • 实体(ENTITIES)
  • CDATA(character data)

  XML语法

  1. 声明:<?xmlversion="1.0" encoding="UTF-8"?>
  2. 根节点:必须有一个根节点
  3. 标签:标签必须有结束且区分大小写,标签必须顺序嵌套
  4. 属性:必须引号引起值
  5. 空格会被保留,HTML空格最多保留一个
  6. 命名规则:命名必须见名知意 a)名字可包含字母、数字以及其他的字符  b)名字不能以数字或者标点符号开始 c)名字不能以字符“xml”(或者XML、Xml)开始
  7. 名字不能包含空格
  8. 不应在 XML 元素名称中使用 ":" ,这是由于它用于命名空间(namespaces)的保留字。
  9. 标签优先于属性。
  10. XML 命名空间可提供避免元素命名冲突的方法。
  11. CDATA:字符数据,<![CDATA[字符数据]]> ,字符数据不进行转义
  12. 实体:&实体;

以下对比较常用的几种方法进行实例演示:

  • Document:代表文档对象 Element:节点对象
  • Attribute:属性
  • Text:文本
  • SAXReader:读取器
  • getRootElement():通过document对象获取该文档的根节点
  • Element addElement(“名称”):添加特定节点 返回值是要被添加的节点
  • addAttribute(“属性名”,“属性值”):为指定节点添加属性 elementIterator:子元素迭代器,返回Iterator对象
  • attributeValue(“属性名”)根据属性名获取属性值 addText:添加文本 remove():移除指定元素 属性…
  • getText:获取文本
package demo;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

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;

/**
 * Document:代表文档对象 Element:节点对象 Attribute:属性 Text:文本 SAXReader:读取器
 * ------------------------------------- getRootElement():通过document对象获取该文档的根节点
 * Element addElement("名称"):添加特定节点 返回值是要被添加的节点
 * addAttribute("属性名","属性值"):为指定节点添加属性 elementIterator:子元素迭代器,返回Iterator对象
 * attributeValue("属性名")根据属性名获取属性值 addText:添加文本 remove():移除指定元素 属性....
 * getText:获取文本
 * 
 * **dom4j:在操作其中的一个节点的同时,必须通过上一级节点进行操作.一定要获取根节点
 * 
 * @author cmy
 * 
 */
public class XMLDemo {
    Document document; // 文档

    public static void main(String[] args) throws Exception {
        XMLDemo demo = new XMLDemo();
        demo.getDocument();
        // demo.addElement();
        // demo.delectElement();
        //demo.modityElement();
        demo.getPhoneById("001");
        demo.saveXML();
    }

    // 1:获取文档对象
    public void getDocument() throws Exception {
        // 创建SAX读取器
        SAXReader reader = new SAXReader();
        document = reader
                .read(this.getClass().getResourceAsStream("phone.xml"));
    }

    // 2:增加元素操作
    public void addElement() {
        // dom4j的特点:通过根节点操作其他的节点 首先获取根节点
        Element root = document.getRootElement();
        // 增加手机节点
        Element phone = root.addElement("phone");
        // 为手机节点增加属性
        phone.addAttribute("id", "004");
        // 依次增加子节点
        Element brand = phone.addElement("brand");
        Element type = phone.addElement("type");
        Element price = phone.addElement("price");
        Element description = phone.addElement("description");

        // 为子节点添加文本值
        brand.addText("vivo");
        type.addText("x23");
        price.addText("3000");
        description.addText("还好的手机");
    }

    // 删除元素操作
    public void delectElement() {
        Element root = document.getRootElement();

        Iterator<Element> interator = root.elementIterator();
        while (interator.hasNext()) {
            Element ele = interator.next();
            if (ele.attributeValue("id").equals("004")) {
                root.remove(ele);
                break;
            }
        }
    }

    // 修改元素操作
    public void modityElement() {
        Element root = document.getRootElement();

        Iterator<Element> iter = root.elementIterator();
        while (iter.hasNext()) {
            Element ele = iter.next();
            if (ele.attributeValue("id").equals("003")) {
                Iterator<Element> inter = ele.elementIterator();
                while (inter.hasNext()) {
                    Element ele2 = inter.next();
                    if (ele2.getName().equals("price")) {
                        ele2.setText("5000");
                    }
                }
            }
        }
    }

    // 查询元素操作 根据Id查询手机信息
    public void getPhoneById(String id){
        Element root = document.getRootElement();
        
        Iterator<Element> iterator=root.elementIterator();
        while(iterator.hasNext()){
            Element ele = iterator.next();
            if(ele.attributeValue("id").equals(id)){ //获取phone节点
                Iterator<Element> iter=ele.elementIterator(); //phone节点下的子节点
                while(iter.hasNext()){
                    System.out.println(iter.next().getText());
                }
                break;
            }
        }
    }
    // 保存操作
    public void saveXML() throws Exception {
        FileWriter fw = new FileWriter(
                "D:\Workspaces\XMLTest\src\demo\phone.xml");

        OutputFormat format = OutputFormat.createPrettyPrint();
        // 设置字符集
        format.setEncoding("GBK");

        XMLWriter writer = new XMLWriter(fw, format);

        writer.write(document);

        writer.flush();

        writer.close();

        fw.close();
    }

}
原文地址:https://www.cnblogs.com/big-data-sky/p/11069278.html