文章目录
XML(EXtensible Markup Langusge)
可扩展标记语言
特点
1、XML与操作系统、编程语言的开发平台无关
2、实现不同操作系统之间的数据交换
##作用
1、数据交换
2、配置应用程序和网站
3、Ajax基石
用法
声明
<?xml version="1.0" encoding="UTF-8"?>
注释
<!--文字描述-->
XML文档内容由一系列标签元素组成
语法
<元素名 属性名="属性值">元素内容</元素名>
注意
1、属性值用引号包裹
2、一个元素可以有多个属性
3、属性值中不能直接包含<、&
4、不建议使用的字符:"、'、>
XML中的转义符列表:
符号 | 转义符 |
---|---|
< | <; |
> | >; |
" | "; |
’ | &apos |
& | & |
注意
1、所有XML元素都必须有结束标签
2、XML标签对大小写敏感
3、XML必须正确的嵌套
4、统计标签以缩进对齐
5、元素名称可以包含字母、数学或其他的字符
6、元素名称不能以数字或者标点符号开始
7、元素名称中不能含空格
命名冲突问题
在XML中,元素名称室友开发者定义的,当两个不用的文档使用相同的元素名时,就会发生命名冲突
1)使用前缀避免命名冲突<a:table><a:name></a:name></a:table>
2使用XML命名空间<a:table xmlns a="http://www.w3.org/TR/html"></a:table>
默认命名空间:
1、没有指定前缀的命名空间就会作为页面中元素的默认命名空间
2、除非在标签中使用其他命名空间的前缀,否则解析器都会认为元素是在默认 命名空间下存在
3、一个文档中只能有一个默认的命名空间
解析XML技术
DOM:(Document Object Model)
1、基于XML文档树结构的解析
2、适用于多次访问的XML文档
3、特点:比较消耗资源
SAX
1、基于事件的解析
2、适用于大数据量的XML文档
3、特点:占用资源少,内存消耗小
DOM解析包:org.w3c.dom
DOM解析
常用接口
1、Document表示整个XML文档:
方法:NodeList getElementsBytagName(String Tag)
说明:按文档顺序返回文档中指定标记名称的所有集合
2、Node:该文档树中的当个节点
方法;NodeList getChildNodes()
说明:获取该元素的所有子节点,返回节点集合
3、Element:XML文档中的一个元素
方法:StringgetTagName()
说明:获取元素名称
节点:元素节点、文本节点、属性节点
DOM解析XNL文件的步骤
1、创建解析工厂对象
2、解析器工厂对象创建解析器对象
3、解析器对象指定XML文件创建Document对象
4、一document对象为起点操作DOM树
DOM解析XML,对其的增删改查操作
public class XMLTest {
// 设置全局变量document
Document document = null;
// 设置文件路径的全局变量
String path = "F:/MyEclipseWorkspace/Practise/src/cn/kgc/practise18/new.xml";
// 获取文件创建工厂,创建Document
public void getDocument() {
// 获取document工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
// 获取Documentbuilder对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 获取文件对象(需要相对路径或绝对路径)
document = builder.parse(path);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 向XML中添加元素
public void addElement(String nodeName, String textContent) {
// 获取phone节点
NodeList nodes = document.getElementsByTagName("phone");
for (int i = 0; i < nodes.getLength(); i++) {
NodeList types = document.getElementsByTagName("type");
for (int j = 0; j < types.getLength(); j++) {
boolean flag1 = ((Element) nodes.item(i)).getAttribute("name").equals(
nodeName);
boolean flag2 = ((Element) types.item(j)).getTextContent().equals(
textContent);
if (flag1&&flag2) {
System.out.println("该元素已存在!");
return;
} else if (flag1&&!flag2) {
// 调用创建type节点
Element typeElement = addTypeNode(textContent);
nodes.item(i).appendChild(typeElement);
savaXML();
return;
}else if(!flag1&&!flag2){
// 调用创建node节点
Element phoneElement = addNode(nodeName);
// 调用创建type节点
Element typeElement = addTypeNode(textContent);
nodes.item(i).getParentNode().appendChild(phoneElement);
phoneElement.appendChild(typeElement);
savaXML();
return ;
}
}
}
}
// 创建node节点
public Element addNode(String nodeName) {
Element element = document.createElement("phone");
element.setAttribute("name", nodeName);
return element;
}
// 创建type节点
public Element addTypeNode(String textContent) {
Element element = document.createElement("type");
element.setTextContent(textContent);
return element;
}
//删除节点phone
public void deleteNodePhone(String PhoneName) {
boolean flag = false;
NodeList nodeList = document.getElementsByTagName("phone");
for (int i = 0; i < nodeList.getLength(); i++) {
if (((Element)nodeList.item(i)).getAttribute("name").equals(PhoneName)) {
nodeList.item(i).getParentNode().removeChild(nodeList.item(i));
flag = true;
break;
}
}
if (!flag) {
System.out.println("******************");
System.out.println("没有您要删除的phone节点!");
System.out.println("******************");
}
savaXML();
}
//删除节点type
public void deleteNodeType(String PhoneName,String content){
boolean phoneFlag = false;
boolean typeFlag = false;
NodeList nodes = document.getElementsByTagName("phone");
for (int i = 0; i < nodes.getLength(); i++) {
if (((Element)nodes.item(i)).getAttribute("name").equals(PhoneName)) {
NodeList types = ((Element)nodes.item(i)).getElementsByTagName("type");
for (int j = 0; j < types.getLength(); j++) {
if (((Element)types.item(j)).getTextContent().equals(content)) {
nodes.item(i).removeChild(types.item(j));
System.out.println("删除type-"+content+"成功!");
typeFlag = true;
}
}
phoneFlag = true;
}
}
if (!phoneFlag) {
System.out.println("没有找到phone-"+PhoneName+"节点!");
if (!typeFlag) {
System.out.println("没有找到phone-"+PhoneName+"节点下type"+content+"节点!");
}
}
savaXML();
}
//更新XML中的phone-name内容
public void updatePhoneName(String oldPhoneName,String newPhoneName) {
boolean flag = false;
NodeList nodes = document.getElementsByTagName("phone");
for (int i = 0; i < nodes.getLength(); i++) {
if (((Element)nodes.item(i)).getAttribute("name").equals(oldPhoneName)) {
((Element)nodes.item(i)).setAttribute("name", newPhoneName);
System.out.println("修改phone-name属性成功");
}
}
if (!flag) {
System.out.println("没有找到phone-name="+oldPhoneName+",删除失败!");
}
savaXML();
}
//更新type内容
public void updateType(String phoneName,String oldType,String newType) {
boolean phoneFlag = false;
boolean typeFlag = false;
NodeList nodes = document.getElementsByTagName("phone");
for (int i = 0; i < nodes.getLength(); i++) {
if (((Element)nodes.item(i)).getAttribute("name").equals(phoneName)) {
NodeList types = ((Element)nodes.item(i)).getElementsByTagName("type");
for (int j = 0; j < types.getLength(); j++) {
if (((Element)types.item(j)).getTextContent().equals(oldType)) {
((Element)types.item(j)).setTextContent(newType);
typeFlag = true;
}
}
phoneFlag = true;
}
}
if (!phoneFlag) {
System.out.println("没找到phone-name="+phoneName+"的手机!");
if (!typeFlag) {
System.out.println("没找到phone-neme"+phoneName+",type="+oldType+"的数据。");
}
}
savaXML();
}
public void showInfor() {
// 获取根节点
NodeList nodes = document.getElementsByTagName("phone");
for (int i = 0; i < nodes.getLength(); i++) {
// 获得phone节点
Element e = (Element) nodes.item(i);
// 打印phone节点中的name属性
System.out.println(e.getAttribute("name"));
// 获得phone节点下的子节点type节点
NodeList types = e.getElementsByTagName("type");
for (int j = 0; j < types.getLength(); j++) {
// 获得子节点type的第j个type标签元素
//System.out.println(Node.ELEMENT_NODE);
Element typeElement = (Element) types.item(j);
System.out.println("\t" + typeElement.getTextContent());
}
}
}
// 保存XML
public void savaXML() {
// 获取解析器工厂
TransformerFactory factory = TransformerFactory.newInstance();
try {
// 获取解析器
Transformer former = factory.newTransformer();
// 获取DOMSource资源
DOMSource source = new DOMSource(document);
// 获取流结果StreamResult
StreamResult result = new StreamResult(path);
// 调用解析器中的transformer方法将XML保存到指定路径
former.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 创建对象
XMLTest xmlTest = new XMLTest();
// 调用getDocument方法
xmlTest.getDocument();
// 调用showInfor方法
// xmlTest.showInfor();
//xmlTest.addElement("小米", "10");
//xmlTest.deleteNodePhone("小米");
//xmlTest.deleteNodeType("小米", "10");
//xmlTest.updatePhoneName("荣耀", "华为");
//xmlTest.updateType("华为", "P40", "P40 Pro");
xmlTest.showInfor();
}
}
保存XML文件的步骤
1、获得TransformerFactory
2、创建Transformer对象
设置输出属性
3、创建DOMSource对象
包含XML信息
4、创建StreamResult对象
包含保存文件信息
5、将XML保存到指定文件中
// 保存XML
public void savaXML() {
// 获取解析器工厂
TransformerFactory factory = TransformerFactory.newInstance();
try {
// 获取解析器
Transformer former = factory.newTransformer();
// 获取DOMSource资源
DOMSource source = new DOMSource(document);
// 获取流结果StreamResult
StreamResult result = new StreamResult(path);
// 调用解析器中的transformer方法将XML保存到指定路径
former.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
JSON(JavaScript Object Notation)
1、轻量级的文本数据交换格式
2、具有自我描述性
3、比XML传输速度块
JSON:www.json.cn
语法
两种数据结构:对象和数组
1、大括号内为对象
2、中括号为数组
对象中的数据由名称/值对构成
1、值的类型可为字符串、数字、布尔值、null、数组、对象
2、数据之间由逗号分隔
数组中的数据类型同名称/值对中值的类型
Fastjson
下载地址:http://central.maven.org/maven2/com/alibaba/fastjson
DOM4J
1、非常优秀的java XML API
2、性能优异、功能强大
3、开放源代码
常用接口
Document接口:定义XML文档
Element接口:定义XML元素
Text接口:定义XML文本节点
Attribute接口:定义XML属性
。。。。
DOM4j下载地址:Https://dom4j.gitubb.io/
基于DOM4j对XML的增删改查
public class DOM4jTest {
Document document = null; //创建Document的全局变量
String path = "book.xml";//创建XML的全局路径
//获取Document对象
public void getDocument() {
SAXReader reader = new SAXReader();//创建SAXReader对象
try {
document = reader.read(path);//获取document
} catch (DocumentException e) {
e.printStackTrace();
}
}
//打印输出book.xml中的内容
public void showInfor() {
Element root = document.getRootElement();//获取根节点
for(Iterator<Element> bookIterator=root.elementIterator();bookIterator.hasNext();){//通过迭代器遍历root下的子节点
Element book = bookIterator.next();//获取子节点元素
System.out.println(book.attributeValue("name"));//打印输出book的name属性
List<Element> fieldList = book.elements();//将book的子节点封装到List集合中
for (int i = 0; i < fieldList.size(); i++) {
Element field = fieldList.get(i);//得到book的子节点
System.out.println("\t"+field.getText());//打印输出book子节点的内容
}
}
}
//保存XML
public void savaXMl(){
OutputFormat format = OutputFormat.createPrettyPrint();//创建OutputFormat对象
format.setEncoding("GB2312");//设置编码格式为UTF-8
XMLWriter writer = null;//声明XMLwriter
OutputStream out = null;
try {
out = new FileOutputStream(path);
writer = new XMLWriter(out,format);//创建XMLwriter对象,并将format格式传入
writer.write(document);//写出文件
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
//关闭流
writer.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//增加XML
public void addNode(String nodeName,String courseName,String authorName) {
Element root = document.getRootElement();//获取根节点
Element book = root.addElement("book");//添加book节点
book.addAttribute("name", nodeName);//将book节点的name属性设置成nodeName
Element name = book.addElement("name");//添加name节点
name.addText(courseName);//在name的文本中添加courseName
Element author = book.addElement("author");//添加author节点
author.addText(authorName);//在author的文本中添加authorName
savaXMl();
}
//删除XMl
public void deleteXML(String courseName) {
Element root = document.getRootElement();//获取根元素
for(Iterator<Element> bookiIterator=root.elementIterator();bookiIterator.hasNext();){//通过迭代器遍历
Element book = bookiIterator.next();//获取迭代器中的book元素
List<Element> fieldList = book.elements();//将book的子元素封装到List集合中
for (int i = 0; i < fieldList.size(); i++) {//循环遍历
Element field = fieldList.get(i);//获取book下的子节点
if (field.getName().equals("name")&&field.getText().equals(courseName)) {//判断是否是name节点,并且节点的文本中是否是courseName
root.remove(book);//移除该book节点
System.out.println("删除成功!");
}
}
}
savaXMl();
}
//修改XMl
public void updateXMl(String nodeName,String CourseName,String authorName) {
Element root = document.getRootElement();//获取根节点
for(Iterator<Element>bookiIterator=root.elementIterator();bookiIterator.hasNext();){//利用迭代器遍历根节点的子节点
Element book = bookiIterator.next();//获取子节点
if (book.attributeValue("name").equals(nodeName)) {//判断book的name属性是不是nodeName for(Iterator<Element>fieldIterator=book.elementIterator();fieldIterator.hasNext();){//迭代器遍历子节点
Element field = fieldIterator.next();//获取name和author子节点
if (field.getName().equals("name")) {//判断field的name是不是name,是的话修改文本为courseName
field.setText(CourseName);
}else {//如果field不是name是author,则将author设置成authorName
field.setText(authorName);
}
}
break;
}
}
savaXMl();
}
//主函数
public static void main(String[] args) {
DOM4jTest dom4jTest = new DOM4jTest();
//获取Document
dom4jTest.getDocument();
//添加XML
//dom4jTest.addNode("book4", "数学", "高达");
//删除XMl中内容
//dom4jTest.deleteXML("数学");
//更新XML
dom4jTest.updateXMl("book3", "数据结构", "大大");
//打印输出
dom4jTest.showInfor();
}
}
//相应的XML的文档
<?xml version="1.0" encoding="GB2312"?>
<books>
<book name="book1">
<name>java开发</name>
<author>圆圆</author>
</book>
<book name="book2">
<name>web开发</name>
<author>橙橙</author>
</book>
<book name="book3">
<name>数据结构</name>
<author>大大</author>
</book>
<book name="book4">
<name>数学</name>
<author>高达</author>
</book>
<book name="book4">
<name>数学</name>
<author>高达</author>
</book>
</books>