XML基础(Extensive Markup Language)
XML是什么:
- 可扩展的标记语言
XML能干什么:
- 描述数据、存储数据、传输(交换)数据。
XML文档节点类型
- 文档(document)
- 元素(element)
- 属性(attribute)
- 文本(PCDATA--parsed character data)
- 注释(comment)
- DOCTYPE :主要验证文档内容的正确性
- 实体(ENTITIES)
- CDATA(character data)
XML语法
- 声明:<?xmlversion="1.0" encoding="UTF-8"?>
- 根节点:必须有一个根节点
- 标签:标签必须有结束且区分大小写,标签必须顺序嵌套
- 属性:必须引号引起值
- 空格会被保留,HTML空格最多保留一个
- 命名规则:命名必须见名知意 a)名字可包含字母、数字以及其他的字符 b)名字不能以数字或者标点符号开始 c)名字不能以字符“xml”(或者XML、Xml)开始
- 名字不能包含空格
- 不应在 XML 元素名称中使用 ":" ,这是由于它用于命名空间(namespaces)的保留字。
- 标签优先于属性。
- XML 命名空间可提供避免元素命名冲突的方法。
- CDATA:字符数据,<![CDATA[字符数据]]> ,字符数据不进行转义
- 实体:&实体;
以下对比较常用的几种方法进行实例演示:
- 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(); } }