利用Java jdk(dom)解析和写入XML文件

来源:互联网 发布:网络调试助手的作用 编辑:程序博客网 时间:2024/05/18 17:44

利用Java jdk(dom)解析和写入XML文件

一、解析XML文件

1、理论基础

使用的是W3C提供的接口,将XML转换为一个树形结构来对每个节点进行读取操作。

2、实战

这个是我正在做的一个项目所要用到的XML文档片段

<Papers><Paper><Layer><Polygon front="true"><point><x>2</x><y>1</y></point><point><x>3</x><y>1</y></point></Polygon></Layer></Paper><Paper><Layer><Polygon front="true"><point><x>4</x><y>1</y></point><point><x>5</x><y>1</y></point></Polygon></Layer></Paper></Papers>



先是将XML文档转为XML Document
File file = new File("Paper.xml");DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse(file);

然后可以直接根据标签名获取NodeList
NodeList nPaper = doc.getElementsByTagName("Paper");

遍历NodeList中的节点并存储其中的数据
for(int i=0;i<nPaper.getLength();i++){NodeList nLayer = nPaper.item(i).getChildNodes();List<Layer> layers = new LinkedList<Layer>();for(int j=0;j<nLayer.getLength();j++){if (nLayer != null && nLayer.item(j).getNodeType() == Node.ELEMENT_NODE) {NodeList nPolygon = nLayer.item(j).getChildNodes();List<Polygon> polygons = new LinkedList<Polygon>();for(int k=0;k<nPolygon.getLength();k++){if (nPolygon != null && nPolygon.item(k).getNodeType() == Node.ELEMENT_NODE){NodeList nPoint = nPolygon.item(k).getChildNodes();List<Point> points = new LinkedList<Point>();nPointToPoints(nPoint,points);Polygon polygon = new Polygon(points);Element element = (Element) nPolygon.item(k);if(element.getAttribute("front").equals("true")){polygon.setFront(true);}else if(element.getAttribute("front").equals("false")){polygon.setFront(false);}polygons.add(polygon);}}Layer layer = new Layer(polygons);layers.add(layer);}}Paper paper = new Paper(layers);papers.add(paper);}
其中Paper Layer Polygon Point都是我创建的实体类用来存储数据的,怎么存储各位根据实际情况判断
ps:一定要注意,某一节点的子节点并不全为元素,必须要进行判断是否为元素节点,比如下面这个判断
if (nPolygon != null && nPolygon.item(k).getNodeType() == Node.ELEMENT_NODE)

二、写入XML

直接实战吧,也是上面的例子,将之前的数据都存入了(List<Paper>)papers中,现在要读取数据并重新写入一个文件

依然是先声明一个Document对象
File file = new File("new.xml");DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder;builder = factory.newDocumentBuilder();Document doc = builder.newDocument();
先声明根元素并添加进doc中
Element root = doc.createElement("Papers");doc.appendChild(root);

循环取出papers中的数据并依次声明元素并添加进父节点的子节点

for(i=0;i<papers.size();i++){Paper paper = papers.get(i);Element ePaper = doc.createElement("Paper");root.appendChild(ePaper);List<Layer> layers = paper.getLayers();for(int j=0;j<layers.size();j++){Layer layer = layers.get(j);Element eLayer = doc.createElement("Layer");ePaper.appendChild(eLayer);List<Polygon> polygons = layer.getPolygons();for(int k=0;k<polygons.size();k++){Polygon polygon = polygons.get(k);Element ePolygon = doc.createElement("Polygon");ePolygon.setAttribute("front", String.valueOf(polygon.getFront()));eLayer.appendChild(ePolygon);List<Point> points = polygon.getPoints();for(int l=0;l<points.size();l++){Point point = points.get(l);Element ePoint = doc.createElement("point");ePolygon.appendChild(ePoint);Element estartX = doc.createElement("x");estartX.setTextContent(String.valueOf(point.getX()));Element estartY = doc.createElement("y");estartY.setTextContent(String.valueOf(point.getY()));ePoint.appendChild(estartX);ePoint.appendChild(estartY);}}}}
最后进行写入
DOMSource src = new DOMSource(doc);  StreamResult sr = new StreamResult(file);TransformerFactory tf = TransformerFactory.newInstance();  Transformer t = tf.newTransformer();  t.setOutputProperty(OutputKeys.INDENT, "yes");  t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");  t.setOutputProperty(OutputKeys.METHOD, "xml");  t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");  t.transform(src, sr); 


详细代码可以参考:
http://download.csdn.net/detail/chen678900/9827806


0 0
原创粉丝点击