对于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);