XML知识小结2

对于XML文档的操作就要利用到解析器,这里介绍几个,分别是DOM,SAX,DOM4J三种。其中DOM方式会将整个XML文件读入内存以便于对整个XML进行操作,但是如果本身的XML文件过大,会导致内存溢出。而SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。而DOM4J则更加灵活,以至于SUN公司也在使用。

DOM解析方式,获得Document对象

DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();

Document doc= db.parse("src/book.xml");

获得遍历所有元素

判断一个Node节点是否为一个元素节点,doc.getNodeType()==Node.ELEMENT_NODE;再使用doc.getNodeName()取得该元素节点的名称。doc.getChildNodes()获得该节点的全部孩子节点,返回NodeList类型数据。对其进行循环,递归直到取出所有元素。

修改某个标签的内容

根据标签名字获得它,Node node=doc.getElementByTagName("作者");

使用node的方法setTextContent(String string)方法来修改。

提到修改就必须要写回XML文件中去,所以这里要用到transforer来写

Transformer ts=TransformerFactroy.newInstance().newTransformer()

ts.transform(new DOMSource(doc),new StreamResult("src/book.xml"))

一个节点添加一个新的元素子节点

Node node=doc.createElement();创造一个新节点,设置内容setTextContent(String string),找到要插入的父节点位置使用appendChild()方法。

一个节点增加其兄弟节点

和上面相同的都是创建一个新节点,通过已知节点的父节点插入,oldnode.getParentNode().insertBefore(newnode,oldnode);

删除一个节点

node.getParentNode().remove(node);通过父亲来删除孩子节点。


SAX方式解析

SAXParser parser=SAXParserFactory.newInstance().newSAXParser();

XMLReader reader=parser.getXMLReader();这样就获得了SAX读取器,要处理数据则需要一个事件处理器,这里可以自定义一个类来继承或者写一个匿名内部类。

class myContentHandler extends DefaultHandler来创建一个自定义类,重写自己所需要的方法。

例如:

public class SaxDemo1 {


public static void main(String[] args) throws Exception {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
XMLReader reader = parser.getXMLReader();
myContentHandler mch=new myContentHandler();
reader.setContentHandler(mch);
reader.parse("src/book.xml");
List<Book> books=mch.getBooks();
for(Book b:books)
{
System.out.println(b);
}
}
}
class myContentHandler extends DefaultHandler{
private List<Book> books=new ArrayList<Book>();
Book book =null;
String Tagname="";
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
Tagname=qName;
if("书".equals(qName)){
book=new Book();
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("书名".equals(Tagname))
{
book.setName(new String(ch,start,length));
}
if("作者".equals(Tagname))
{
book.setAuthor(new String(ch,start,length));
}
if("售价".equals(Tagname))
{
book.setPrice(new String(ch,start,length));
}


}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("书".equals(qName))
{
books.add(book);
}
Tagname="";
}
public List<Book> getBooks() {
return books;
}
}

将XML中所得到的数据封装到一个JavaBean中。


DOM4J方式,要将jar包导入所在工程。dom4j-1.6.1和jaxen-1.1

获得document:Document document=new SAXReader().read("src/exam.xml");

这里定义获取根元素的方法,Element root=document.getRootElement();

添加元素:root.addElement("student").addAttribute("examid",String str);

删除元素:String xpath="//name"

document.selectNodes(xpath);这里使用了xpath路径

查找元素:document.selectSingleNode(xpath)根据具体查询获得单个node节点。

另外还有专门的XMLWriter来写出数据,可以指定输出格式。

OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("src/exam.xml"),format);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值