用java处理xml文件

文章目录

DOM

处理小规模的xml文件,擅长xml读/写。
处理方式是将xml整个作为类似树结构的方式读入内存中。
读示例:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
//自上而下进行访问
public static void recursiveTraverse()
    {
    
    
    	try 
    	{
    
    
    		//采用Dom解析xml文件,固定格式
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse("users.xml");
            
            //获取所有的一级子节点
            NodeList usersList = document.getChildNodes();
            System.out.println(usersList.getLength());  //1  
            
            for (int i = 0; i < usersList.getLength(); i++) 
            {
    
    
                Node users = usersList.item(i);         //1  users 
                
                NodeList userList = users.getChildNodes(); //获取二级子节点user的列表
                System.out.println("==" + userList.getLength()); //9
                
                for (int j = 0; j < userList.getLength(); j++) //9
                {
    
    
                    Node user = userList.item(j);
                    if (user.getNodeType() == Node.ELEMENT_NODE)
                    {
    
    
                    	 NodeList metaList = user.getChildNodes();
                         System.out.println("====" + metaList.getLength()); //7
                         
                         for (int k = 0; k < metaList.getLength(); k++) //7
                         {
    
    
                         	//到最后一级文本
                        	Node meta = metaList.item(k);
                        	if (meta.getNodeType() == Node.ELEMENT_NODE)
                        	{
    
    
                        		System.out.println(metaList.item(k).getNodeName() 
                        				+ ":" + metaList.item(k).getTextContent());
                        	}                                                              
                         }                    
                         System.out.println();
                    }                   
                }
            }            
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } 
    }   
   
   public static void traverseBySearch()
    {
    
    
    	try 
    	{
    
    
    		//采用Dom解析xml文件,固定格式
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse("users.xml");
            
            Element rootElement = document.getDocumentElement();         

            NodeList nodeList = rootElement.getElementsByTagName("name"); //根据某一标签选定元素
            if(nodeList != null) 
            {
    
     
               for (int i = 0 ; i < nodeList.getLength(); i++) 
               {
    
     
                  Element element = (Element)nodeList.item(i);                  
                  System.out.println(element.getNodeName() + " = " + element.getTextContent());
               } 
            }             
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } 	
    }       

写示例:

try {
    
    
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();
			
			//新创建一个Document节点
			Document document = dbBuilder.newDocument();
			if (document != null) 
			{
    
    
				Element docx = document.createElement("document");	//都是采用Document创建元素		
				Element element = document.createElement("element");
				element.setAttribute("type", "paragraph"); 
				element.setAttribute("alignment", "left"); //element增加2个属性
				
				Element object = document.createElement("object");
				object.setAttribute("type", "text");
				
				Element text = document.createElement("text");
				text.appendChild(document.createTextNode("abcdefg")); //给text节点赋值
				Element bold = document.createElement("bold");
				bold.appendChild(document.createTextNode("true"));    //给bold节点赋值
				
				object.appendChild(text);      //把text节点挂在object下
				object.appendChild(bold);      //把bold节点挂在object下
				element.appendChild(object);   //把object节点挂在element下
				docx.appendChild(element);	   //把element节点挂在docx下		
				document.appendChild(docx);    //把docx挂在document下
				
				TransformerFactory transformerFactory = TransformerFactory.newInstance();
				Transformer transformer = transformerFactory.newTransformer();
				DOMSource source = new DOMSource(document);
				
				//定义目标文件
				File file = new File("dom_result.xml");
				StreamResult result = new StreamResult(file);
		 	 
				//将xml内容写入到文件中
				transformer.transform(source, result);
				
				System.out.println("write xml file successfully");
			}
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}		
	}	

写的结果:
在这里插入图片描述

SAX

采用流模型处理XML(推模式)。多用于读。

package xml.sax;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class SAXReader {
    
    
	public static void main(String[] args) throws SAXException, IOException {
    
    
		XMLReader parser = XMLReaderFactory.createXMLReader();
		BookHandler bookHandler = new BookHandler();
		parser.setContentHandler(bookHandler);
		parser.parse("books.xml");
		System.out.println(bookHandler.getNameList());
	}
}

class BookHandler extends DefaultHandler {
    
    
	private List<String> nameList;
	private boolean title = false;

	public List<String> getNameList() {
    
    
		return nameList;
	}

	// xml文档加载时
	public void startDocument() throws SAXException {
    
    
		System.out.println("Start parsing document...");
		nameList = new ArrayList<String>();
	}

	// 文档解析结束
	public void endDocument() throws SAXException {
    
    
		System.out.println("End");
	}

	// 访问某一个元素
	public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
    
    

		if (qName.equals("title")) {
    
    
			title = true;
		}
	}

	// 结束访问元素
	public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
    
    
		// End of processing current element
		if (title) {
    
    
			title = false;
		}
	}

	// 访问元素正文
	public void characters(char[] ch, int start, int length) {
    
    
		
		if (title) {
    
    
			String bookTitle = new String(ch, start, length);
			System.out.println("Book title: " + bookTitle);
			nameList.add(bookTitle);
		}
	}
}

Stax

流机制解释器(拉模式)。多用于读。

package xml.stax;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;


public class StaxReader {
    
    
	
	public static void main(String[] args) {
    
    
		StaxReader.readByStream();
		System.out.println("========分割线==========");
		StaxReader.readByEvent();
	}

	public static void readByStream() {
    
    
		String xmlFile = "books.xml";
		XMLInputFactory factory = XMLInputFactory.newFactory();
		XMLStreamReader streamReader = null;
		try {
    
    
			streamReader = factory.createXMLStreamReader(new FileReader(xmlFile));			
		} catch (FileNotFoundException e) {
    
    
			e.printStackTrace();
		} catch (XMLStreamException e) {
    
    
			e.printStackTrace();
		}
		
		
		try {
    
    
			while (streamReader.hasNext()) {
    
    
				int event = streamReader.next();
			
				if (event == XMLStreamConstants.START_ELEMENT) {
    
    
					
					if ("title".equalsIgnoreCase(streamReader.getLocalName())) {
    
    
						System.out.println("title:" + streamReader.getElementText());
					}
				}
			}
			streamReader.close();
		} catch (XMLStreamException e) {
    
    
			e.printStackTrace();
		}
	}
	
	public static void readByEvent() {
    
    
		String xmlFile = "books.xml";
		XMLInputFactory factory = XMLInputFactory.newInstance();
		boolean titleFlag = false;
		try {
    
    

			XMLEventReader eventReader = factory.createXMLEventReader(new FileReader(xmlFile));
	
			while (eventReader.hasNext()) {
    
    
				XMLEvent event = eventReader.nextEvent();
				
				if (event.isStartElement()) {
    
    
					
					StartElement start = event.asStartElement();
					
					String name = start.getName().getLocalPart();
					//System.out.print(start.getName().getLocalPart());	
					if(name.equals("title"))
					{
    
    
						titleFlag = true;
						System.out.print("title:");
					}
					
					
					Iterator attrs = start.getAttributes();
					while (attrs.hasNext()) {
    
    
						
						Attribute attr = (Attribute) attrs.next();
						//System.out.print(":" + attr.getName().getLocalPart() + "=" + attr.getValue());
					}
					//System.out.println();
				}
				
				if(event.isCharacters())
				{
    
    
					String s = event.asCharacters().getData();
					if(null != s && s.trim().length()>0 && titleFlag)
					{
    
    
						System.out.println(s.trim());
					}					
				}
				
				if(event.isEndElement())
				{
    
    
					EndElement end = event.asEndElement();
					String name = end.getName().getLocalPart();
					if(name.equals("title"))
					{
    
    
						titleFlag = false;
					}
				}
			}
			eventReader.close();
		} catch (FileNotFoundException e) {
    
    
			e.printStackTrace();
		} catch (XMLStreamException e) {
    
    
			e.printStackTrace();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/DwenKing/article/details/108980350
今日推荐