XML用来储存信息,不需要显示出来
XML(可扩展标记语言)(不需要编译的语言)
XML 好处:其实hml=xml+http4(跨平台开发,既能写移动端,也能写pc)
1.支持跨平台,各系统;
2.可以自由编写标签,可扩展性比较好
3.用于保存数据html5(显示数据) 支持ajax异步刷新技术
非验证性解析错误(基本常用的错误(比如语法格式不对),浏览器会帮你报错并解析)。
高级解析器(一般会声明命名空间,跟我们java里面的包名一样,防止类冲突),设置我们的DTD的命名,规定你的XML布局的顺序,规定了XML只能写哪些标签。这个顺序,一般可以在http://mybatis.org/dtd/mybatis-3-config.dtd找到具体的规范。
XML特殊符号:
< < 小于号
> > 大于号
& & 和
' ’ 单引号
" ” 双引号
XML特点:
1.所有元素都必须有结束标签;
2.XML对大小写敏感;
3.XML必须正确的嵌套;
4.同级标签以缩进对其;
5.元素名称中不能含有空格(name value等这些);
不同解析的特点:
1.dom解析 XML树 它的缺点是首先就整个DOM加载到我们的内存里,会给内存造成一定的压力;
2.Dom 4j解析 对DOM的封装,优化了DOM的操作,是DOM量减少;
3.Sax(移动端)解析 边解析边加载,效率更高,局限于小的xml;
一般开发比较常用的是DOM解析,因为这种jar包比较少,没有第三方jar包。
NodeList list = dom.getElementsByTagName(“brand”);
//获得所有 标签名为brand的所有节点的集合
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
//遍历集合中的节点
Element elementbrand = (Element) node;
//把node节点 强转为元素
如果获取的节点集合中包含文本节点:
for (int j = 0; j < childlist.getLength(); j++) {
Node nodetype = childlist.item(j);
//要先进行判断,因为如果有空格或者文本,就是文本节点,没法转换为元素节点
if(nodetype.getNodeType()==Node.ELEMENT_NODE){
Element element = (Element) nodetype;
XML的DM4j操作方法:
package com.offcn.text;
import java.io.File;
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;
public class DOM4j操作方法 {
private Document dom;
//得到Document对象
public void getDom(){
try {
SAXReader saxreader= new SAXReader();
saxreader.read(new File("src/phone.xml"));
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void show(){
Element rootElement = dom.getRootElement();
//获得根节点
Iterator <Element> elementIterator = rootElement.elementIterator();
//迭代器需要个泛型。
//迭代器遍历
while(elementIterator.hasNext()){
//获得元素
Element element = elementIterator.next();
//获得元素的name属性的值
String value = element.attributeValue(“name”);
//获得element迭代器,来获得element子元素
Iterator<Element> elementIterator2 = element.elementIterator();
while(elementIterator2.hasNext()){
Element element2 = elementIterator2.next();
element2.attributeValue("name");
}
}
}
public void add(String path){
//在dom中找到根标签元素
Element rootElement = dom.getRootElement();
//创建brand标签元素 name= “三星”
Element brand = rootElement.addElement("brand");
brand.setAttributeValue("name", "三星");
//创建type标签子节点,name="note4"
Element type = brand.addElement("type");
type.setAttributeValue("name", "note4");
save(path);
}
public void save(String path){
try {
OutputFormat format = OutputFormat.createCompactFormat();
//设置编码格式
format.setEncoding("utf-8");
XMLWriter xmlWriter = new XMLWriter(new FileWriter(path), format);
xmlWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void update(String path){
Element rootElement = dom.getRootElement();
Iterator<Element> elementIterator = rootElement.elementIterator();
while(elementIterator.hasNext()){
Element element = elementIterator.next();
if(element.attributeValue("name").equals("三星")){
element.setAttributeValue("name", "华为");
}
}
save(path);
}
}
DOM操作方法:
package com.offcn.text;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.nio.file.Path;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
//dom解析XML
public class XML的DM操作方法 {
public static void main(String[] args) {
XML的DM操作方法 test = new XML的DM操作方法();
test.getDoM();
test.add();
test.save("src/new.xml");
}
private Document dom;
//创建一个获得dom对象的方法。
public void getDoM(){
try {
//简单工厂者设计模式
//首先得到DOM解析器工厂
DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
//得到DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//得到DOM对象,记录加载的XML路径,解析XML路径
dom = db.parse(“src/phone.xml”);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//展示XML的方法
}
public void show(){
NodeList list = dom.getElementsByTagName("brand");
//获得所有 标签名为brand的所有节点的集合
//遍历集合
for (int i = 0; i < list.getLength(); i++) {
//遍历集合中的节点
Node node = list.item(i);
//把node节点 强转为元素
Element elementbrand = (Element) node;
//元素设置获得name的value值
elementbrand.getAttribute("name");
NodeList childlist = elementbrand.getChildNodes();
for (int j = 0; j < childlist.getLength(); j++) {
Node nodetype = childlist.item(j);
//把node强转为元素节点,但是要先进行判断,因为如果有空格或者文本,就是文本节点,没法转换为元素节点
if(nodetype.getNodeType()==Node.ELEMENT_NODE){
Element element = (Element) nodetype;
System.out.println(element.getAttribute("name"));
}
}
}
}
//添加一个brand标签
public void add(){
//创建brand标签
Element elementbrand = dom.createElement("brand");
//给节点赋值
elementbrand.setAttribute("name", "三星");
//创建type 标签
Element elementtype = dom.createElement("type");
//赋值
elementtype.setAttribute("name", "note4");
//type标签添加到brand标签里
elementbrand.appendChild(elementtype);
//获取根节点,把brand节点添加到根节点里
dom.getElementsByTagName("PhoneInfo").item(0).appendChild(elementbrand);
}
//如何把DOM对象的数据写入XML?
public void save(String path){
//获得一个XML转换器的工厂
try {
TransformerFactory tff= TransformerFactory.newInstance();
//设置4个空格
tff.setAttribute("indent-number", 4);
//从工厂对象获得转换器
Transformer tf = tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.setOutputProperty(OutputKeys.ENCODING, "utf-8");
//
//得到source对象
DOMSource domSource= new DOMSource(dom);
//用这个输出流的原因是:设置编码,解决乱码
StreamResult streamResult = new StreamResult(new OutputStreamWriter(new FileOutputStream(path),"utf-8"));
//开始进行转换,
tf.transform(domSource, streamResult);
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//添加元素属性id
public void updateId(String path){
NodeList nodeList = dom.getElementsByTagName("brand");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node= nodeList.item(i);
Element element = (Element) node;
element.setAttribute("id",(i+1)+"");
//(i+1)+""是吧i+1拼接成字符串,如果放在双引号内,i就不是变量了
}
this.save(path);
}
public void delete(String path){
NodeList list = dom.getElementsByTagName("brand");
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
Element element = (Element) node;
element.getParentNode().removeChild(element);
}
save(path);
}
}