xml基础知识(3)

XML DOM解析


1.xml的解析方式有两种

Dom解析,Sax解析


2.(面试题)Dom解析和Sax解析两种解析方法的区别
(1)Dom解析的优点:对文档增删改查比较方便
     缺点:占用内存比较大
(2)Sax解析的优点:占用内存少,解析速度快
     缺点:不适合做文件的增删改


3.xml解析开发包
dom4j,Jdom,Jaxp(sun)


4.使用Jaxp对文档进行dom解析

@Test
/**
* 读指定文件
* @throws Exception
*/
public void read() 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(1);
String content = node.getTextContent();
System.out.println(content);
}


/**
* 读指定元素的指定属性
* @throws Exception
*/
@Test
public void read2() throws Exception {


//创建工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//解析文件
Document document = builder.parse("src/book.xml");

Element bookName = (Element)document.getElementsByTagName("书名").item(0);
String value = bookName.getAttribute("name");
System.out.println(value);
}


/**
* 遍历xml文件
* @throws Exception
*/
@Test
public void read3() 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);
}
/**
* 具体的遍历方法
* @param node
*/
private void List(Node node) {

//只打印标签,其余的不打印
if(node instanceof Element){
System.out.println(node);
}

//得到孩子节点
NodeList list = node.getChildNodes();

//递归遍历
for(int i=0;i<list.getLength();i++){
Node child = list.item(i);
List(child);
}
}


/**
* 添加一个元素
* @throws Exception 
*/
@Test
public void addElement() throws Exception{

//解析文件
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");

//创建要添加的元素
Element publish = document.createElement("出版社");
publish.setTextContent("新华出版社");
publish.setAttribute("name", "新华");

//找到要添加元素的父元素
Element book = (Element)document.getElementsByTagName("书").item(0);

//找到要添加元素的参照元素
Element refElement = (Element)document.getElementsByTagName("售价").item(0);

//将元素插入到相应的位置
book.insertBefore(publish, refElement);

//将更新后内存写回到xml文档
TransformerFactory trsFactory = TransformerFactory.newInstance();
Transformer transformer = trsFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
}



@Test
/**
* 删除指定元素
* @throws Exception
*/
public void delete() throws Exception{

//解析文件
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");

Element publish = (Element)document.getElementsByTagName("出版社").item(0);
Element book = (Element)document.getElementsByTagName("书").item(0);
book.removeChild(publish);

TransformerFactory trsfFactory = TransformerFactory.newInstance();
Transformer transformer = trsfFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
}

/**
* 删除指定元素(2)
* @throws Exception 
* @throws SAXException 
*/
@Test
public void delete2() throws SAXException, Exception{

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml"); 

Element publish = (Element)document.getElementsByTagName("出版社").item(0);
publish.getParentNode().removeChild(publish);

TransformerFactory trsFactory = TransformerFactory.newInstance();
Transformer transformer = trsFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
}

/**
* 删除指定节点所在的父节点
* @throws Exception 
*/
@Test
public void delete3() throws Exception{

//解析文件
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/book.xml");

//得到指定节点
Element publish = (Element)document.getElementsByTagName("出版社").item(0);


//得到指定节点的父节点
Element parentElement = (Element) publish.getParentNode();
System.out.println(parentElement);
//得到指定节点的爷爷节点
Element grandparentElement = (Element)parentElement.getParentNode();
//删除指定节点的父节点
grandparentElement.removeChild(parentElement);



TransformerFactory trsFactory = TransformerFactory.newInstance();
Transformer transformer = trsFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值