JAVA解析和创建XML文件的四种方法(一)

JAVA自带的两种解析方式

一、DOM

1、DOM解析xml文件
首先创建一个xml文件

<?xml version="1.0"?>
<students>
    <student id="1">
        <name>小民</name>
        <age>93</age>
    </student>
    <student id="2">
        <name>小泽</name>
        <age>13</age>
    </student>
</students>

DOM常用结点类型

节点类型NodeTypenodeName返回值nodeValue返回值
Element1element namenull
Attr2属性名称属性值
text3#text结点内容
public class DOMtest {
    public static void main(String args[]){
    //1、创建一个DocumentBuilderFactory
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
        //2、创建一个DocumentBuilder
            DocumentBuilder Builder = dbf.newDocumentBuilder();
            //3、使用DocumentBuilder对象的parse方法
            Document document = Builder.parse("src/XMLtest/test/student.xml");
            //parse方法可以传入uri、File对象、InputStream对象、InputSource
            //直接获取student标签
            NodeList nodeList = document.getElementsByTagName("student");
            for (int i = 0,len=nodeList.getLength(); i < len; i++) {
                Node n  = nodeList.item(i);
                //获取结点的属性集合
                NamedNodeMap nnm = n.getAttributes(); 
                for (int i1 = 0; i1 < nnm.getLength(); i1++) {
                    Node attr = nnm.item(i1);
					//输出结点的属性名和属性值                    
                    System.out.print(attr.getNodeName()+"="+attr.getNodeValue()+" ");
                }
                //这里获取的childnode包括换行的#text结点
                NodeList childNodes = n.getChildNodes();
                for (int i1 = 0; i1 < childNodes.getLength(); i1++){
                    Node cn  =childNodes.item(i1);
                    //这里要判断是否为ELEMENT_NODE结点
                    if(cn.getNodeType()== Node.ELEMENT_NODE){
                        System.out.println(cn.getNodeName()+cn.getTextContent());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果
在这里插入图片描述
2、DOM创建xml文件

public static void main(String args[]){
		//创建xml文件
		//1、创建一个DocumentBuilderFactory
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
        	//2、创建一个DocumentBuilder
            DocumentBuilder db = dbf.newDocumentBuilder();
            //3、使用newDocument方法创建新的document
            Document document = db.newDocument();
            document.setXmlStandalone(true);   //不显示standalone
            //创建students element
            Element students = document.createElement("students");
            document.appendChild(students);
            Element student = document.createElement("student");

            student.setAttribute("id","1");
            Element name = document.createElement("name");
            name.setTextContent("小民");
            student.appendChild(name);
            students.appendChild(student);
			//储存xml文件
			//1、创建TransformerFactory对象
            TransformerFactory tff = TransformerFactory.newInstance();
            //2、创建Transformer
            Transformer transformer = tff.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT,"yes");  					//是否换行
            transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");//设置编码
            //调用transform(Source xmlSource, Result outputTarget)
            transformer.transform(new DOMSource(document),new StreamResult(new File("DOM_student.xml")));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述

二、SAX

1、SAX解析xml文件

首先创建SAXparserHandle类继承DefaultHandler用于解析xml

public class SAXparserHandle extends DefaultHandler {
    private String value = null;
    //接收文档开始
    @Override
    public void startDocument() throws SAXException {
        System.out.println("SAX解析开始");
        super.startDocument();
    }

	//接收文档结束
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("SAX解析结束");
    }
	
	//接收element开始 uri和localName均为Namespace的属性
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        //如果当前element的qName为student则输出他的属性
        if (qName.equals("student")){
            for (int i = 0; i < attributes.getLength(); i++) {
                System.out.println(attributes.getQName(i)+"="+attributes.getValue(i));
            }
        }
    }
	
	//接收element结束
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        //由于一个标签内的text在标签之中所以要在此标签结束后读取text
        if (qName.equals("name")){
            System.out.println("name"+":"+value);
        }else if (qName.equals("age")){
            System.out.println("age"+":"+value);
        }
    }

	//接收element内字符数据
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        //记录读取到的数据
        value = new String(ch,start,length);
    }
}
public class SAXtest {
    public static void main(String args[]) {
    	//1、创建SAXParserFactory对象
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
        	//2、创建SAXParser对象
            SAXParser saxParser = factory.newSAXParser();
            //3、创建一个Handle用于解析xml 需要自己创建类
            SAXparserHandle handle = new SAXparserHandle();
            //4、调用parse方法
            saxParser.parse("src/XMLtest/test/student.xml",handle);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

解析结果
在这里插入图片描述
2、SAX创建xml文件

public class SAXtest {
    public static void main(String args[]) {
    //1、创建SAXTransformerFactory对象
        SAXTransformerFactory stff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
        try {
        	//2、创建TransformerHandler
            TransformerHandler tfh = stff.newTransformerHandler();
            //3、设置TransformerHandler的一些属性
            Transformer tr = tfh.getTransformer();
            tr.setOutputProperty(OutputKeys.ENCODING,"utf-8");
            //是否换行
            tr.setOutputProperty(OutputKeys.INDENT,"yes");
            Result result = new StreamResult(new FileOutputStream("SAX_student.xml"));
            //设置输出要在开始Document之前设置
            tfh.setResult(result);
			
			//开始创建Document
            tfh.startDocument();
            
            //AttributesImpl用于创建element的属性
            AttributesImpl att = new AttributesImpl();
            tfh.startElement("","","students",att);


            att.clear();
            att.addAttribute("","","id","","1");
            //student元素开始
            tfh.startElement("","","student",att);
            att.clear();
            //name元素开始
            tfh.startElement("","","name",att);
            tfh.characters("小民".toCharArray(),0,"小民".length());
            tfh.endElement("","","name");
            //age元素开始
            tfh.startElement("","","age",att);
            tfh.characters("93".toCharArray(),0,"93".length());
            tfh.endElement("","","age");
            //student元素结束
            tfh.endElement("","","student");
			

            tfh.endElement("","","students");
            tfh.endDocument();


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

生成文件
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用SAX和Java生成XML的步骤如下: 1. 创建一个 SAXParserFactory 实例并且用它来创建一个 SAXParser 对象。 2. 创建一个 DefaultHandler 的子类实例。 3. 调用 SAXParser 的 parse() 方法,并将 XML 文件名和 DefaultHandler 子类实例作为参数传入。 下面是一个使用 SAX 和 Java 创建 XML 文件的示例代码: ```java import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import java.io.*; public class CreateXMLWithSAX { public static void main(String[] args) throws Exception { // 创建 SAXParserFactory 和 SAXParser 对象 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); // 创建 DefaultHandler 的子类实例 MyHandler handler = new MyHandler(); // 调用 parse() 方法解析 XML 文件 saxParser.parse(new File("students.xml"), handler); } } class MyHandler extends DefaultHandler { // 重写 startDocument() 方法 public void startDocument() throws SAXException { System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); System.out.println("<students>"); } // 重写 startElement() 方法 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.print("<" + qName); for (int i = 0; i < attributes.getLength(); i++) { System.out.print(" " + attributes.getQName(i) + "=\"" + attributes.getValue(i) + "\""); } System.out.print(">"); } // 重写 characters() 方法 public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch, start, length)); } // 重写 endElement() 方法 public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</" + qName + ">"); } // 重写 endDocument() 方法 public void endDocument() throws SAXException { System.out.println("</students>"); } } ``` 这个示例程序会读取名为 "students.xml" 的 XML 文件,并将其转化为以下格式的 XML: ```xml <?xml version="1.0" encoding="UTF-8"?> <students> <student id="1001">Tom</student> <student id="1002">Jerry</student> <student id="1003">Mike</student> </students> ``` 注意:这个示例程序中,MyHandler 类继承了 DefaultHandler 类,并且重写了其中的方法,这些方法会在 SAX 解析过程中被调用。在这些方法中,我们可以根据需要对 XML 文件进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值