创建xml文件:
//获取DocumentBuilderFactory工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
// 设置去掉空格的方法
factory.setIgnoringElementContentWhitespace(true);
// 获取解析器
DocumentBuilder builder=factory.newDocumentBuilder();
//创建document接口
Document doc = builder.newDocument();
//设置版本
doc.setXmlVersion("1.0");
//创建注释
Comment comment = doc.createComment("创建xml文件");
//把注释添加到document接口
doc.appendChild(comment);
//建立XML 元素的根结点,参数为学生
Element root = doc.createElement("学生");
//建立XML 元素的子结点,参数为姓名
Element name = doc.createElement("姓名");
//建立文字结点,并把它追加到子结点name中
name.appendChild(doc.createTextNode("redarmy_chen"));
//建立XML 元素的子结点,参数为性别
Element sex = doc.createElement("性别");
//设置sex子结点的文字结点
sex.setAttribute("name", "男");
//把子结点追加到根结点上
root.appendChild(name);
root.appendChild(sex);
//把根结点追加到xml中
doc.appendChild(root);
//建立TransformerFactory对象
TransformerFactory factory1 = TransformerFactory.newInstance();
//以XSLT Script文件作为输入建立Transformer对象
Transformer tformer = factory1.newTransformer();
//转换xml文档
tformer.transform(new DOMSource(doc), new StreamResult("src//ds.xml"));
}
在src下建dom.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 中国[
<!ELEMENT 中国 (北京,河南*,河北)>
<!ELEMENT 北京 (海淀)>
<!ELEMENT 海淀 (上地,中关村,东北旺)>
<!ELEMENT 上地 (#PCDATA)>
<!ELEMENT 中关村 (#PCDATA)>
<!ELEMENT 东北旺 (#PCDATA)>
<!ELEMENT 河南 (郑州,安阳)>
<!ELEMENT 郑州 (商丘)>
<!ELEMENT 商丘 (#PCDATA)>
<!ELEMENT 安阳 EMPTY>
<!ELEMENT 河北 (石家庄)>
<!ELEMENT 石家庄 EMPTY>
<!ATTLIST 商丘 人口 CDATA #IMPLIED>
<!ATTLIST 安阳 人口 CDATA #IMPLIED>
<!ATTLIST 石家庄 人口 CDATA #IMPLIED>
]>
<中国>
<北京>
<海淀>
<上地>上地七街</上地>
<中关村>鼎好</中关村>
<东北旺>软件园</东北旺>
</海淀>
</北京>
<河南>
<郑州>
<商丘 人口="100万">商丘中学</商丘>
</郑州>
<安阳 />
</河南>
<河北>
<石家庄 人口="2000万"/>
</河北>
</中国>
// 遍历所有的xml文档中的内容
@Test
public void test1() throws Exception {
//获取DocumentBuilderFactory工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 设置去掉空格的方法
factory.setIgnoringElementContentWhitespace(true);
// 获取解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析xml文档
Document document = builder.parse(new File("src//dom.xml"));
//获取根结点对象
Element root = document.getDocumentElement();
//获取根结点元素名称
String tagname = root.getTagName();
System.out.println("根结点的名称是:"+root.getTagName());
//调用Node中的getChildNodes()获取根结点的子结点
NodeList Nlist = root.getChildNodes();
//遍历该子结点
display(Nlist);
}
//使用递归遍历个子结点中的子结点
public void display(NodeList Nlist){
for (int i = 0; i <Nlist.getLength(); i++) {
Node node = Nlist.item(i);
System.out.println(node.getNodeName());
if(node.hasChildNodes()){//判断该结点是否还有子结点
NodeList list = node.getChildNodes();
display(list);//调用方法本身
}else{
if(node.getNodeType()==Node.TEXT_NODE){
System.out.println("---------"+node.getTextContent());
}
break;
}
}
}
/**解析商丘的人口这个这个属性*/
public void test1()throws Exception{
//获取DocumentBuilderFactory工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获取解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析xml文档
Document document = builder.parse(new File("src//dom.xml"));
// 获得商丘的属性里表
NodeList list = document.getElementsByTagName("商丘");
Node node = list.item(0);
if(node.getNodeType()== Node.ELEMENT_NODE){
Element element = (Element)node;
String value = element.getAttribute("人口");
System.out.println("属性的值是:"+value);
}
}下面的代码实现的与上边的效果一样
public void test2()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("src//dom.xml"));
Element element = document.getElementById("attr");
String value = element.getAttribute("id");
String value1 = element.getAttribute("人口");
System.out.println("属性的值是:"+value+" "+value1);
}
运行结果如下:属性的值是:100万
增加一个子结点
public void test()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("src//dom.xml"));
//增加一个子结点,并添加结点内容“地方”
Element element = doc.createElement("东北旺");
element.appendChild(doc.createTextNode("地方"));
Node node = doc.getElementsByTagName("海淀").item(0);
node.appendChild(element);
TransformerFactory factory1 = TransformerFactory.newInstance();
Transformer tformer = factory1.newTransformer();
tformer.transform(new DOMSource(doc), new StreamResult("src//dom.xml"));
}运行结果如下:
<北京>
<海淀>
<上地>上地七街</上地>
<中关村>鼎好</中关村>
<东北旺>软件园</东北旺>
<东北旺>家</东北旺>
</海淀>
</北京>
<河南>
<郑州>
<商丘 人口="100万">商丘中学</商丘>
</郑州>
<安阳/>
</河南>
<河北>
<石家庄 人口="2000万"/>
</河北>
</中国>
public void test1()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("src//dom.xml"));
Node node = doc.getElementsByTagName("海淀").item(0);
//删除第二个东北旺的子结点
node.removeChild(doc.getElementsByTagName("东北旺").item(1));
TransformerFactory factory1 = TransformerFactory.newInstance();
Transformer tformer = factory1.newTransformer();
tformer.transform(new DOMSource(doc), new StreamResult("src//dom.xml"));
}运行结果如下:
<北京>
<海淀>
<上地>上地七街</上地>
<中关村>鼎好</中关村>
<东北旺>软件园</东北旺>
</海淀>
</北京>
<河南>
<郑州>
<商丘 人口="100万">商丘中学</商丘>
</郑州>
<安阳/>
</河南>
<河北>
<石家庄 人口="2000万"/>
</河北>
</中国>
public void test2()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("src//dom.xml"));
//改变东北旺的内容结点
Node node1 = doc.getElementsByTagName("东北旺").item(0);
node1.setTextContent("杀人");
TransformerFactory factory1 = TransformerFactory.newInstance();
Transformer tformer = factory1.newTransformer();
tformer.transform(new DOMSource(doc), new StreamResult("src//dom.xml"));
}
<北京>
<海淀>
<上地>上地七街</上地>
<中关村>鼎好</中关村>
<东北旺>杀人</东北旺>
<东北旺>家</东北旺></海淀>
</北京>
<河南>
<郑州>
<商丘 人口="100万">商丘中学</商丘>
</郑州>
<安阳/>
</河南>
<河北>
<石家庄 人口="2000万"/>
</河北>
</中国>
在一个节点前插入一个节点
在jdk6.ZH_cn.chm中有一个这样一个方法,
insertBefore(Node newChild, Node refChild) |
方法具体说法如下:
insertBefore
Node insertBefore(Node newChild,
Node refChild)
throws DOMException
在现有子节点 refChild 之前插入节点 newChild。如果 refChild 为 null,则将 newChild 插入到子节点列表的末尾。
如果 newChild 为 DocumentFragment 对象,则以同样的顺序将其所有节点插入 refChild 之前。如果 newChild 已经存在于树中,则首先移除它。
注:将一个节点插入本身之前与实现有关。
参数:
newChild- 要插入的节点。
refChild- 引用节点,即必须在其前插入新节点的节点。
返回:
要插入的节点。
抛出:
DOMException- HIERARCHY_REQUEST_ERR:在以下情况下引发此异常:如果此节点为不允许 newChild 节点类型的子节点的类型;或者如果要插入的节点为此节点的一个祖先或此节点本身;或者如果此节点为 Document 类型且 DOM 应用程序试图插入第二个 DocumentType 或 Element 节点。
WRONG_DOCUMENT_ERR:如果 newChild 是从不同的文档创建的,不是从创建此节点的文档创建的,则引发此异常。
NO_MODIFICATION_ALLOWED_ERR:如果此节点为只读的,或者如果要插入的节点的父节点为只读的,则引发此异常。
NOT_FOUND_ERR: 如果 refChild 不是此节点的子节点。
NOT_SUPPORTED_ERR: 如果此节点为 Document 类型,如果 DOM 实现不支持插入 DocumentType 或 Element 节点,则可能引发此异常。
因此我们可以用这个方法在一个节点前插入一个节点 代码实现如下:
@Test
public void test4()throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder docment = factory.newDocumentBuilder();
Document doc = docment.parse(new File("src//book.xml"));
Element element1= doc.createElement("price");
Node node=doc.getElementsByTagName("book").item(0);
NodeList List=node.getChildNodes();
Node node1=List.item(1);
node.insertBefore(element1, node1);
TransformerFactory factory1 = TransformerFactory.newInstance();
Transformer tformer = factory1.newTransformer();
tformer
.transform(new DOMSource(doc),
new StreamResult("src//book.xml"));
}