JAXP下的XML解析用法(包括dom解析和sax解析)

/**
* Jaxp下的xml文件dom解析操作,参考文档JDK javax.xml.parsers.DocumentBuilder类
*/
@Test
//读取某一个标签的内容
public void read(){

//创建一个工厂实例
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//获取documentbuilder 对象
DocumentBuilder builder=factory.newDocumentBuilder();
//获取到document节点
Document document= builder.parse("src/book.xml");
//获取到element标签
NodeList node=document.getElementsByTagName("书名");
String content=node.item(1).getTextContent();
System.out.println(content);
} catch (Exception e) {
// TODO: handle exception
}

}
@Test
//读取xml所有标签
public void read1(){
//创建一个工厂实例
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//获取documentbuilder 对象
DocumentBuilder builder=factory.newDocumentBuilder();
Document document= builder.parse("src/book.xml");
Node node=document.getElementsByTagName("书架").item(0);
list(node);
} catch (Exception e) {
// TODO: handle exception
}
}

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);
}
}
//根据获取标签属性
@Test
public void read3(){
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//获取documentbuilder 对象
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);
} catch (Exception e) {
// TODO: handle exception
}
}

//增加一个节点会员价
@Test
public void save1(){
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//获取documentbuilder 对象
DocumentBuilder builder=factory.newDocumentBuilder();
Document document= builder.parse("src/book.xml");
Element e= document.createElement("会员价");
e.setTextContent("10¥");

Element bookname=(Element)document.getElementsByTagName("小说").item(0);
bookname.appendChild(e);


TransformerFactory tran=TransformerFactory.newInstance();
Transformer tf=tran.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
} catch (Exception e) {
// TODO: handle exception
}
}
//根据指定节点增加一个 会员价 (在单价前面加)
@Test
public void save2(){
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//获取documentbuilder 对象
DocumentBuilder builder=factory.newDocumentBuilder();
Document document= builder.parse("src/book.xml");
//创建一个节点
Element e= document.createElement("会员价");
e.setTextContent("10¥");
//找到参考节点
Element refChild=(Element) document.getElementsByTagName("单价").item(0);

//获得要插入子节点的节点
Element book=(Element)document.getElementsByTagName("小说").item(0);
//将创建的节点按照参考节点插入book节点中
book.insertBefore(e, refChild);

TransformerFactory tran=TransformerFactory.newInstance();
Transformer tf=tran.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
} catch (Exception e) {
// TODO: handle exception
}
}
@Test
//插入属性
public void save3(){
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//获取documentbuilder 对象
DocumentBuilder builder=factory.newDocumentBuilder();
Document document= builder.parse("src/book.xml");

//要创建属性的节点
Element e=(Element) document.getElementsByTagName("书名").item(1);
e.setAttribute("name", "xxxx");
TransformerFactory tran=TransformerFactory.newInstance();
Transformer tf=tran.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
} catch (Exception e) {
// TODO: handle exception
}
}
@Test
//修改一个子节点值
public void update1(){
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//获取documentbuilder 对象
DocumentBuilder builder=factory.newDocumentBuilder();
Document document= builder.parse("src/book.xml");
//获取要修改的子节点
Element e=(Element) document.getElementsByTagName("书名").item(1);
e.setTextContent("笑傲江湖");

TransformerFactory tran=TransformerFactory.newInstance();
Transformer tf=tran.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
} catch (Exception e) {
// TODO: handle exception
}
}
//删除一个子节点
@Test
public void delect1(){
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//获取documentbuilder 对象
DocumentBuilder builder=factory.newDocumentBuilder();
Document document= builder.parse("src/book.xml");
//找到要删除的节点
Element e=(Element) document.getElementsByTagName("小说").item(0);
Element e1=(Element) document.getElementsByTagName("会员价").item(0);
e.removeChild(e1);
TransformerFactory tran=TransformerFactory.newInstance();
Transformer tf=tran.newTransformer();
tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
} catch (Exception e) {
// TODO: handle exception

}

}


/**
* Jaxp 对xml文档进行sax解析

*/
//读取book.xml文档并存入实体中
@Test
public void saxRead(){
// 1.创建解析工厂
SAXParserFactory spf=SAXParserFactory.newInstance();
try {
//2.得到解析器
SAXParser sf=spf.newSAXParser();
//3.读取解析器
XMLReader xmlReader=sf.getXMLReader();
//4.设置内容处理器
BeanListHandler b=new BeanListHandler();
xmlReader.setContentHandler(b);

//读取xml内容
try {
xmlReader.parse("src/book.xml");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
List<Book> list=b.getList();
for (Book book : list) {
System.out.println(book.getName());
}

} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


//处理器
class BeanListHandler extends DefaultHandler{


private String currentTag;
private List <Book>list=new ArrayList();
public List getList() {
return list;
}



private Book b;
//开始读标签
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
this.currentTag=qName;
if(this.currentTag.equals("小说")){
b=new Book();
}
}

//标签内容
public void characters(char[] ch, int start, int length)
throws SAXException {
if("书名".equals(this.currentTag)){
b.setName(new String(ch,start,length));
}
if("作者".equals(this.currentTag)){
b.setAuthor(new String(ch,start,length));
}
if("单价".equals(this.currentTag)){
b.setMoney(new String(ch,start,length));
}


}
//标签结束
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equals("小说")){
list.add(b);
b=null;
}
this.currentTag=null;

}


book.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
<小说>
<书名 name="tianlong">天龙八部</书名>
<作者>金庸</作者>
<单价>20¥</单价>
</小说>
<小说>
<书名 name="xxxx">笑傲江湖</书名>
<作者>金庸</作者>
<单价>40¥</单价>
</小说>
</书架>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值