1.XML的作用是作为配置文件和描述数据与数据之间的关系。
2.XML语法:
最原始的文档声明
<?XMLversion="1.0" ?>
encoding属性是说明字符编码
<?XMLversion="1.0" encoding="gb2312" ?>
standalone说明文档是否是独立的
<?XMLversion="1.0" encoding="gb2312"standalone="yes"?>
3.XML元素指的是XML文件中出现的标签,一个标签有结束标签和开始标签。
4.对于XML标签中出现的空格或者换行,XML解析程序都会当成标签内容来处理,所以,原来的书写习惯要改变一下。
5.属性
一个标签可以有多个属性,每个属性都有自己的名称和取值,
例如:<input name = "text">,属性值一定要用“或‘标起来,
多学一招:
<input>
<name>text</name>
</input>
此种形式同上。
6.CDATA
当有些内容不希望解析程序处理的时候,可以放进CDATA区内,这样解析程序就会原封不动的输出CDATA区内的内容。语法如下:
<![CDATA[...]]>
7.处理指令
简称PI(Processing Instruction),处理指令用来指挥解析引擎如何解析文档内容。例如,在XML标签里面的内容可以使用xml-stylesheet指令,通知解析引擎通过CSS文件来显示文档内容,<?xml-stylesheettype="text/css" href="1.css">,处理指令必须在<?...?>内部,声明语句就是最常见的一种指令。
8.XML两种约束方式
一种是XML DTD文件,一种是XML schame文件。
先说说DTD方式,可以自己单独一个文件,也可以和XML文件在同一文件内,
语法如图:
#REQUIRED表示此项必须标明,#IMPLIED表示此项是可选。
以上就是XML的基本语法了,接下来要进行的是XML编程(CRUD)。
1.Xml文档的两种解析方式
我们在开始编程的时候,首先要知道解析的两种方式,一种是dom,一种是sax,dom是先将整个文档读进内存中,然后将一个个标签都封装为对象,它的优点是CRUD很方便,但是占用内存空间大。
Sax是一条一条指令读进内存里,这种方式适合读取文档,解析速度快,但是CRUD不适合。
2.如何改变jvm的允许使用内存上限
在我们进行编程的时候,随着程序逐渐扩大,我们的程序占用的大小可能会逐渐变大,但是JVM最大只允许我们用64M内存,这时候就需要我们手动扩大上限,在jvm的配置里面写上-Xmx80m,这样我们就可以使用80兆,以此类推。
3.如何利用Java编程对xml文档进行增删改查(CRUD)
1)前置步骤
首先将xml文档转换为document对象,代码如下:
// 第一步,创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 第二步,获得dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 第三步,解析xml文件,获得代表文档的document
Document document = builder.parse("src/book.xml");
如何将更改后的document对象写入内存并向xml文件进行写入
//把更新后的内存写进xml文件
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/book.xml")));
2)在dom解析下,XML文档中的任意组成部分都可以用对象来表示,例如:元素可以用element,属性可以用attr表示,但是不管是什么对象,都是node的子类,所以在开发中可以将任意的节点都当做是node对待,也就是所谓的向上转型,多态的存在。
3)获取某个节点源码如下:
public void read1() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
NodeList list = document.getElementsByTagName("书名");
Node node= list.item(0);
String content = node.getTextContent();
System.out.println(content);
}
4)遍历xml所有的元素标签(节点)源码:
//遍历所有的元素标签
@Test
public void read2() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
Node root = document.getElementsByTagName("书架").item(0);
list(root);
}
private void list(Node node) {
if (node instanceof Element) {
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node child = list.item(i);
list(child);
}
}
5)向xml文件中添加节点源码:
//向xml文件中添加标签:<售价>34.00</售价>
@Test
public void add() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//创建节点
Element price = document.createElement("售价");
price.setTextContent("49");
//将新节点挂在第一本书上
Element book = (Element) document.getElementsByTagName("书").item(0);
book.appendChild(price);
//把更新后的内存写进xml文件
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/book.xml")));
}
6)向xml文件中指定位置添加节点源码:
//向xml文件中指定位置添加标签:<售价>34.00</售价>
@Test
public void add2() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//创建节点
Element price = document.createElement("售价");
price.setTextContent("49");
//获得参考节点
Element refNode = (Element) document.getElementsByTagName("售价").item(0);
//得到要挂孩子的节点
Element book = (Element) document.getElementsByTagName("书").item(0);
//将新节点插入到指定位置
book.insertBefore(price, refNode);
//把更新后的内存写进xml文件
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/book.xml")));
}
7)向xml文件中的标签添加属性源码:
//向xml文件的标签中添加属性:<售价>34.00</售价> 添加name="price"属性
@Test
public void addAttr() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//得到要添加属性的节点
Element price = (Element) document.getElementsByTagName("售价").item(0);
//添加属性
price.setAttribute("name", "price");
//把更新后的内存写进xml文件
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/book.xml")));
}
8)删除节点的第一种方式源码:
//第一种删除xml的标签的方法:<售价>34.00</售价>
@Test
public void delete1() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//得到要删除的节点
Element e = (Element) document.getElementsByTagName("售价").item(0);
//得到被删除节点的父亲
Element father = (Element) document.getElementsByTagName("书").item(0);
//调用父亲的删除方法
father.removeChild(e);
//把更新后的内存写进xml文件
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/book.xml")));
}
9)删除节点的第二种方式源码:
//第2种删除xml的标签的方法:<售价>34.00</售价>
@Test
public void delete2() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//得到要删除的节点
Element e = (Element) document.getElementsByTagName("售价").item(0);
//通过孩子来得到被删除节点的父亲
e.getParentNode().removeChild(e);
//把更新后的内存写进xml文件
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/book.xml")));
}
10)将节点中的内容进行更新源码:
//更新售价:<售价>104.00</售价>
@Test
public void update() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");
//得到要更新的节点
Element e = (Element) document.getElementsByTagName("售价").item(0);
e.setTextContent("104");
//把更新后的内存写进xml文件
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document),
new StreamResult(new FileOutputStream("src/book.xml")));
}