XML的两种解析方式的具体应用

XML解析方式

XML解析的方式一般分为俩种:

​ DOM解析

​ SAX解析

简单写一下这两个解析的解析代码
如有对DOM解析和SAX解析不理解的可以下方评论。分享一些干货给你们

cd.xml文件的解析

cd.xml

<?xml version="1.0" encoding="UTF-8"?>
<cds>
	<cd id="x112">
		<name>周杰伦</name>
		<price>155.5</price>
		<title>七里香</title>
	</cd>
	<cd id="x113">
		<name>林俊杰</name>
		<price>156.1</price>
		<title>江南</title>
	</cd>
	<cd id="x114">
		<name>蔡依林</name>
		<price>155.65</price>
		<title></title>
	</cd>
	<cd id="x115">
		<name>蔡徐坤</name>
		<price>15.61</price>
		<title>篮球</title>
	</cd>
	<cd id="x116">
		<name>毛不易</name>
		<price>156.1</price>
		<title>入海</title>
	</cd>
</cds>

DOM解析:

JAXP中的DOM解析的步骤:

调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂

调用工厂对象的 newDocumentBuilder 方法得到 DOM 解析器对象

调用 DOM 解析器对象的 parse() 方法解析 XML 文档parse() 方法会返回解析得到的 Document 对象

然后根据根据文档的结构关系和特点,调用相应的API,对其进行解析

	public static void main(String[] args) throws Exception {
        //获取解析工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //从解析工厂获取解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
        //获取document对象
		Document document = builder.parse("src/com/briup/day6/cd.xml");
        //获取根节点
		Element root = document.getDocumentElement();
		System.out.println("根节点为:" + root.getNodeName());
        //获取所有子节点
		NodeList list = root.getChildNodes();
		for (int i = 0; i < list.getLength(); i++) {
			Node node = list.item(i);
            //筛选掉文本节点
			if (node.getNodeType() == Node.ELEMENT_NODE) {
                //获取当前节点的所有属性
				NamedNodeMap map = node.getAttributes();
				for (int j = 0; j < map.getLength(); j++) {
					Node item = map.item(j);
					System.out.println(item.getNodeName() + ":" + item.getNodeValue());
                    //获取当前节点的子节点
					NodeList list2 = node.getChildNodes();
					for (int k = 0; k < list2.getLength(); k++) {
						Node item2 = list2.item(k);
						if(item2.getNodeType() == Node.ELEMENT_NODE) {
							System.out.println(item2.getNodeName() + ":" + item2.getTextContent());
						}
					}
				}
			}
		}
	}

SAX解析:

在基于SAX解析的程序中,有五个最常用SAX事件:

  1. startDocument() , 解析器发现了文档的开始标签,会自动调用该方法

  2. endDocument() , 解析器发现了文档结束标签,会自动调用该方法

  3. startElement() , 解析器发现了一个起始标签 ,会自动调用该方法

  4. character() , 解析器发现了标签里面的文本值,会自动调用该方法

  5. endElement() , 解析器发现了一个结束标签,会自动调用该方法

JAXP中的SAX解析的步骤:

获取SAXParserFactory工厂类对象, SAXParserFactory.newInstance()

使用工厂对象,创建出SAX解析器, saxParserFactory.newSAXParser()

调用解析器的 parse() 解析xml文件,然后重写DefaultHandler类中的方法,进行事件处理

saxParser.parse(filePath, new DefaultHandler(){…}

	public static void main(String[] args) throws Exception, SAXException {
        //获取解析工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
       //获取解析器
		SAXParser saxParser = factory.newSAXParser();
        //开始解析
		saxParser.parse("src/com/briup/day6/cd.xml", new DefaultHandler() {
			@Override
			public void startDocument() throws SAXException {
				System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
			}
			
			@Override
			public void startElement(String uri, String localName, String qName, Attributes attributes)
					throws SAXException {
				StringBuffer sb = new StringBuffer();
				sb.append("<").append(qName);
				for (int i = 0; i < attributes.getLength(); i++) {
					sb.append(" ")
						.append(attributes.getQName(i))
						.append("=")
						.append("\"")
						.append(attributes.getValue(i))
						.append("\"");
				}
				sb.append(">");
				System.out.print(sb);
			}
			
			@Override
			public void endElement(String uri, String localName, String qName) throws SAXException {
				StringBuffer sb = new StringBuffer();
				sb.append("</")
					.append(qName)
					.append(">");
				System.out.print(sb);
			}
			
			@Override
			public void characters(char[] ch, int start, int length) throws SAXException {
				System.out.print(new String(ch, start, length));
			}
		});
	}

DOM4J解析:

使用第三方jar。如有需要可在下方评论。

Dom4j 是一个Java的XML API,用来读写XML文件的,它是一个十分优秀的Java XML API,具有性能 优异、功能强大和极其易使用的特点,且开源免费。

	public static void main(String[] args) throws Exception {
		SAXReader sr = new SAXReader();
		//获取document对象
		Document document = sr.read("src/com/briup/day6/cd.xml");
        //获取根节点
		Element root = document.getRootElement();
		System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		String name = root.getName();
		StringBuffer sb = new StringBuffer();
		sb.append("<").append(name).append(">").append("\n");
        //获取所有子节点
		List<Element> list = root.elements();
		for (int i = 0; i < list.size(); i++) {
			List<Attribute> attributes = list.get(i).attributes();
			for (int j = 0; j < attributes.size(); j++) {
				sb.append("   <")
				.append(list.get(i).getName())
				.append(" ")
				.append(attributes.get(j).getName())
				.append("=")
				.append("\"")
				.append(attributes.get(j).getValue())
				.append("\"")
				.append(">")
				.append("\n");
				List<Element> list2 = list.get(i).elements();
				for (int k = 0; k < list2.size(); k++) {
					sb.append("      <")
					.append(list2.get(k).getName())
					.append(">")
					.append(list2.get(k).getText())
					.append("</")
					.append(list2.get(k).getName())
					.append(">")
					.append("\n");
				}
				sb.append("   <")
					.append(list.get(i).getName())
					.append("/>")
					.append("\n");
			}
		}
		System.out.println(sb.append("</").append(name).append(">").append("\n"));
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值