加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML生成和解析

发布时间:2020-12-16 08:28:15 所属栏目:百科 来源:网络整理
导读:1、 DOM方式解析XML 给予DOM的解析方式,是把整个XML文档加载到内存,转化成DOM树,可以随机的访问DOM树的任何数据,速度快、比较灵活,但是消耗资源比较多,不适用大的xml文档解析,测试超过10M内存溢出。 public class DOM01 { public static void printAt

1、DOM方式解析XML

给予DOM的解析方式,是把整个XML文档加载到内存,转化成DOM树,可以随机的访问DOM树的任何数据,速度快、比较灵活,但是消耗资源比较多,不适用大的xml文档解析,测试超过10M内存溢出。

public class DOM01 {

    public static void printAttr(Node node){
        NamedNodeMap map = node.getAttributes();
        for(int i=0;i<map.getLength();i++){
            Node attrNode = map.item(0);
            System.out.println(attrNode.getNodeName()+":"+attrNode.getFirstChild().getNodeValue());
        }
    }
    
    public static void main(String[] args) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse("src/student.xml");
            NodeList nodeLlist =  doc.getElementsByTagName("students");
            Element element = (Element)nodeLlist.item(0);
            NodeList studentNodeList = element.getElementsByTagName("student");
            for(int i=0;i<studentNodeList.getLength();i++){
                Element e = (Element)studentNodeList.item(i);
                
                //e.getElementsByTagName("name").item(0).getFirstChild().setNodeValue("haha");
                System.out.println(e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
                printAttr(e.getElementsByTagName("name").item(0));
            }
//            System.out.println("姓名:"+element.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2、SAX方式解析xml

SAX工作原理是对文档顺序扫描,当扫描到文档开始与结束、元素开始结束等地方时通知回调函数做出相应的动作,然后继续扫描,直至文档结束。消耗资源比较少,适合大文档解析,但是只能读取不能修改,开发也较复杂。

public class SAX extends DefaultHandler{
	
	private List<Student> students = null;
	private Student student = null;
	private String preTag = null;//记录上一个节点名称
	
	@Override
	public void startDocument() throws SAXException {
		System.out.println("开始读取学生信息");
		students  = new ArrayList<Student>();
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("n 信息读取完毕");
	}

	@Override
	public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
		if("student".equals(qName)){
			student = new Student();
			student.setId(attributes.getValue(0));
		}preTag = qName;
	}

	@Override
	public void endElement(String uri,String qName) throws SAXException {
		if("student".equals(qName)){
			 students.add(student);
			 student = null;
		}preTag = null;
	}

	@Override
	public void characters(char[] ch,int start,int length) throws SAXException {
		if(preTag != null){
			String content = new String(ch,start,length);
			if("name".equals(preTag)){
				student.setName(content);
			}else if("sex".equals(preTag)){
				student.setSex(content);
			}else if("age".equals(preTag)){
				student.setAge(content);
			}
		}
	}

	public static void main(String[] args) throws Exception{
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		SAX sax = new SAX();
		parser.parse("src/student.xml",sax);
		for(Student student : sax.students){
			System.out.println(student);
		}
	}
	
}

JDOM和DOM4j解析xml:

两个都是解析XML优秀的框架,但是两者也有区别,具体可以参考http://www.cnblogs.com/zhi-hao/p/4016363.html

JDOM封装xml实例:

public class JDOM01 {

	public static void main(String[] args) throws Exception{
		Element student = new Element("student");
		
		Attribute id = new Attribute("id","001"); 
		Attribute aa = new Attribute("aa","xx"); 
		student.setAttribute(id);
		student.setAttribute(aa);
		
		Element name = new Element("name");
		Element age = new Element("age");
		Element sex = new Element("sex");
		
		name.setText("张三");
		student.addContent(name);
		sex.setText("男");
		student.addContent(sex);
		age.setText("18");
		student.addContent(age);
		
		Document document = new Document(student);
		XMLOutputter outputter = new XMLOutputter();
		outputter.setFormat(outputter.getFormat().setEncoding("UTF-8"));
		
		outputter.output(document,new FileOutputStream("src/student2.xml"));
	}
}

JDOM解析xml实例:

public class JDOM02 {

	public static void main(String[] args) throws Exception{
		SAXBuilder builder = new SAXBuilder();
		Document document = builder.build("src/student.xml");
		Element students = document.getRootElement();
		List studentList = students.getChildren("student");
		for(int i=0;i<studentList.size();i++){
			Element student = (Element)studentList.get(i);
			String id = student.getAttributeValue("id");
			String name = student.getChildText("name");
			String sex = student.getChildText("sex");
			String age = student.getChildText("age");
			System.out.println("学号:"+id+",姓名:"+name+",性别:"+sex+",年龄:"+age);
		}
		
	}
}

DOM4j封装xml实例:

public class DOM4j01 {

	public static void main(String[] args) throws Exception{
		Document document = DocumentHelper.createDocument();
		Element studentElement = document.addElement("student");
		studentElement.addAttribute("id","001");
		studentElement.addAttribute("aa","xx");
		Element name = studentElement.addElement("name");
		name.setText("张三");
		Element sex = studentElement.addElement("sex");
		sex.setText("男");
		Element age = studentElement.addElement("age");
		age.setText("20");
		
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/student3.xml"),format);
		writer.write(document);
		writer.close();
	}
}

DOM4j解析xml实例:

public class DOM4j02 {

	public static void main(String[] args) throws Exception{
		SAXReader saxReader = new SAXReader();
		Document doc =  saxReader.read("src/student.xml");
		
		Element rootElement = doc.getRootElement();
		@SuppressWarnings("rawtypes")
		Iterator iter = rootElement.elementIterator();
		while(iter.hasNext()){
			Element studentElement = (Element)iter.next();
			System.out.println("学号:"+studentElement.attributeValue("id"));
			System.out.println("姓名:"+studentElement.elementText("name"));
			System.out.println("=========================================");
		}
	}
}

总的来说DOM4J是最好的,目前许多开源项目中也大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性,那就采用DOM4J吧

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读