可拓展的标记语言
树状结构
语法:
{
<?xml version="1.0" encoding="UTF-8"?>
<students>
<students id="1235">
<name>李四</name>
<age>16</age>
</students>
<--注释-->
<students id="2535">
<name>张三</name>
<age>18</age>
</students>
</students>
}
XML的约束
dtd schema约束
DOM:Document 文档对象模型(XML文档中使用对象来表示)
使用JavaScript操作HTML 使用java代码操作XML
在XML中 一切皆节点
Node(节点)
Document 文档节点(XML文件)
Element 元素节点(使用<>表示标签)
Attr 属性节点(元素上属性名=“属性值”)
Text 文本节点(元素之间的内容)
在加载的时候,整个XML加载进内存。在内存中形成一棵树(Document对象),我们以后用代码操作Document,其实操作的是内存中的DOM树,和本地磁盘中的XML文件没有直接的关系,所以要做同步操作(把内存中的数据更新到XML文件,)增 删 改 操作之后 都需要做同步操作
(注)使用impot导入类或者接口 要使用org.w3c组织的
/******************************
如何获取DOM文档对象
必须先得到呗操作XML文件的路径
步骤
1):获取Document文档对象
//创建工厂类
DocumentBuilderFactory factor=DocumentBuilderFactory.newInstance();
//用工厂创建一个DocumentBuilder类
DocumentBuilder dbr=factor.newDocumentBuilder();
//用DocumentBuilder创建一个Document取解析XML文件
Document doc=dbr.parse(f);
System.out.println(doc);
//2):获取XML中的根元素
Element ele=doc.getDocumentElement();
//3):获取第二个人元素
Element ele1=(Element) ele.getElementsByTagName(“teachers”).item(1);
//4):获取子元素
Element name1=(Element) ele1.getElementsByTagName(“name”).item(0);
//5):获取元素的文本
String namee=name1.getTextContent();
System.out.println(namee);
//改第一个人的年纪
//获取第一个人的元素
Element ele0=(Element) ele.getElementsByTagName("teacher").item(0);
//获取第一个人的年纪元素
Element age0=(Element) ele0.getElementsByTagName("age").item(0);
age0.setTextContent("13");
System.out.println(age0.getTextContent());
//必须做同步操作 把内存中的数据同步更新到磁盘中
//获取同步方法类 Transformer
Transformer ts=TransformerFactory.newInstance().newTransformer();
Source xmlSource=new DOMSource(doc);//源:内存中的Document对象
Result outputTarget=new StreamResult(f);
ts.transform(xmlSource, outputTarget);
/************
//向XML中新增一个元素
//从根元素开始
//创建一个元素的片段
//创建元素
Element el0=doc.createElement(“teacher”);
Element el=doc.createElement(“name”);
Element el1=doc.createElement(“age”);
//给片段设置文本内容
el.setTextContent(“张武”);
el1.setTextContent(“16”);
//把元素设立关系 (子元素 父元素)
el0.appendChild(el1);
el0.appendChild(el1);
//把片段作为根元素的子元素
ele.appendChild(el0);
//同步操作
Transformer tsf=TransformerFactory.newInstance().newTransformer();
Source xmlSource1=new DOMSource(doc);//源:内存中的Document对象
Result outputTarget1=new StreamResult(f);
tsf.transform(xmlSource1, outputTarget1);
//操作属性
//操作属性
//获取第二个人的属性的值
String i=ele1.getAttribute(“id”);//获取属性值
System.out.println(i);
ele1.setAttribute(“id”, “3”);//设置属性值
//同步
Transformer tsf1=TransformerFactory.newInstance().newTransformer();
Source xmlSource2=new DOMSource(doc);//源:内存中的Document对象
Result outputTarget2=new StreamResult(f);
tsf1.transform(xmlSource2, outputTarget2);
//
//删除元素
//删除元素操作
//找到要删除的元素(从根元素删除子元素)
ele.removeChild(ele1);
ele1.removeAttribute(“age”);//从元素删除属性
//当无XML文件的时候 在内存中创建
DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
//f存在就解析 不存在就创建
Document dc=null;
if(f.exists())
dc=builder.parse(f);
else{
dc=builder.newDocument();
//创建根元素 并作为文档的的子元素
dc.appendChild(dc.createElement("daa"));
}
/*********************************************
Dom4j
private File f=new File(“F:/JAVA/课程练习/XmlTrain/NewFile1.xml”);
@Test
public void testDom4j() throws Exception {
//解析
SAXReader reader=new SAXReader();
//文档doc获取
Document doc=reader.read(f);
//获取跟元素
Element root=doc.getRootElement();
//获取根元素下的所有元素
List<Element> listele=root.elements("teacher");
for (Element element : listele) {
System.out.println(element);
//获取每个子元素的名字元素
/*Element nameel=element.element("name");
String str=nameel.getText();*/
String str=element.elementText("name");
System.out.println(str);
//获取属性
String strId=element.attributeValue("id");
//设置元素
Attribute strId1=element.attribute("id");
strId1.setText("5");
}
}
//增加
@Test
public void testname() throws Exception {
//获取文档对象
SAXReader reader=new SAXReader();
Document doc=reader.read(f);
//获取根元素
Element root=doc.getRootElement();
//创建teacher并给root当子元素
Element ele=root.addElement("teacher");
//创建ele的子元素 name age
ele.addElement("name").setText("张li");
ele.addElement("age").setText("16");
//同步
FileWriter out=new FileWriter(f);
doc.write(out);
out.close();
}