DOM解析XML

来源:互联网 发布:开淘宝店怎么寻找货源 编辑:程序博客网 时间:2024/06/05 07:22

创建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中有一个这样一个方法,

 Node

insertBefore(Node newChild, Node refChild)
          在现有子节点 refChild 之前插入节点 newChild

方法具体说法如下:

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"));

}

0 0
原创粉丝点击