1.什么是XML?
XML指可扩展标记语言
它是一种很像HTML的标记语言,它的设计宗旨是传输数据,而不是显示数据。HTML中的元素是固定的,而XML标签没有被预定义,可以由用户来进行自定义
,XML被设计为具有自我描述性,且跨平台。
2.XML文档结构
XML的扩展名为.xml,它由两大部分组成,头部的声明和下面的主体描述信息。
声明一般处于XML文件的第一行,用来标注XML的配置属性。
version:
采用什么版本的XML规范。
encoding
:采用什么编码格式存储信息。
主体描述信息由一系列的标记/标签/元素/“节点”
组成,XML一定且仅有一个根元素,根元素的开始标签放在最前面,结束标签放在最后面,包裹着自定义的描述信息。
2.1XML的标签
和HTML一样,XML都是由标记/标签组成,也可称为元素。属性值中不能直接包含<、""、&等。
2.2XML的编写注意事项
-
所有XML元素都必须有结束标签。
-
XML标签对大小写敏感。
-
XML必须正确的嵌套。
-
同级标签以缩进对齐。
-
元素名称可以包含
字母
、数字
或其他字符。元素名不能以数字或者标点符号开始。
元素名中不能包含空格。
2.3XML中的转义符
上面提到了XML中属性值等信息里不允许出现一些特殊符号,< ’ & "等,因为它们在XML中有特殊含义,就像Java不能使用关键字表示一些自定义信息一样。如果还是享用这些符号,可以采用对应的标记语言的转义符。
当大量的转移字符出现在XML文档中时,会师XML文档的可读性大幅降低。这时如果使用CDATA段会好一些。
XML解析技术
DOM解析
在这些解析方式里,DOM师最基础的解析方式,由W3C开发,并内置在我们的Java类库中,API包地址为:org.w3c.dom.***。
DOM师Document Object Model(文档对想模型)的意思。它的解析方式要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
DOM解析包:org.w3c.dom
查看XML内容
获取Document对象
public static void getXMLDocument(){
try{
// 1.创建解析器工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.解析器工厂对象创建解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 3.解析器对象指定XML文件创建Document对象
doc = builder.parse(new File("XXX"));
}catch{
....
}
}
展示信息
public static void showNode(){
// 获取所有的brand集合
NodeList list = doc.getElementsByTagName("Brand");
// 遍历集合
for(int i = 0;i < list.getLength;i ++){
// 获取每一个brand元素
Node item = list.item(i);
// 强转
Element ele = (Element) item;
// 获得二bradn名称
String brand = ele.getAttribute("name");
// 获得type名称
NodeList typeList = ele.getChiledNodes();
// 遍历集合
for(int j = 0;j < typeList.getLength();j ++){
Node item2 = typeList.item(j);
//判断是否是Element类型此处类型有个编号所有用==来比价即可
if(item2.getNodeType() == Node.ELEMNT_NODE){
Element ele2 =(Element)item2;
String type = ele2.getAttribute("name");
System.out.println(brand + ":" + type);
}
}
}
}
给XML添加内容
public static void addNode(){
// 添加新的元素
Element ele = doc.createElement("brand");
ele.setAttribute("name","三星");
// 创建子元素
Element eleType = doc.createElement("type");
eleType.setAttribute("name","Note7");
// 将子元素添加到父元素下
ele.appendChild(eleType);
// 获取根节点getElementsByTagName是获取节点集合然后item(0)表示获取第一个
Node item = doc.getElementsByTagName("phoneInfo").item(0);
// 添加到根节点下
item.appendChile(ele);
}
保存XML内容
注意:无论是添加还是修改只要操作了,一定要记得保存XML信息。
实现步骤
public static void saveXML(){
try{
// 1.获得TransformerFactory转换工厂对象
TransformerFactory factory = TransformerFactory.newInstance();
// 2.创建Transformer转换对象
Transformer former = factory.newTransformer();
// 3.创建DOMSource对象 传入doc对象即包含XML信息数据源
DOMSource domSource = new DOMSource(doc);
// 4.转换器设置输出属性 转码格式
former.setOutputProperty(“encoding”,“UTF-8”);
// 5.创建StreamResult对象,包含保存文件的信息,保存到什么地方 数据目的地
StreamResult streamResult = new StreamResult(new FIleOutputStream("src/“xxx”));
// 6.将XML保存到指定地方
former.transform(domSource,streamResult);
}
}
修改/删除XML内容
public static void updateNode() {
// 获取所有的Brand元素
NodeList list = doc.getElementsByTagName("brand");
// 遍历集合
for(int i = 0;i < lis.getLength; i ++){
// 获取每一个brand元素
Node item = list.item(i);
// 强转为获得方法
Element ele = (Element)item;
// 如果元素name属性是三星就进行修改
if(ele.getAttribute("name").equals("三星")){
// 修改SAMSUNG
ele.setAttribute("name","SAMSUNG");
}
}
}
删除
public static void deletNode() {
// 获取所有的brand元素
NodeList list = doc.getElementsByTagName("brand");
// 遍历集合
for(int i = 0;i < list.getLength();i ++) {
// 获取每一个brand元素
Node item = list.item(i);
// 强转为了获得方法
Element ele = (Element) item;
if(ele.getAttribute("name").equals("SAMSUNG")){
// 获得父节点并删除自己
ele.getParentNode().removeChild(ele);
}
}
}
DOM4J解析
常用API如下: