java解析xml SAX和StAX

SAX

技术要点: 1)用javax.xml.parsers包中的类去获取一个"XML阅读

器"org.xml.sax.XMLReader

2)用这个"XML阅读器"去解析我们的XML文档---因为是只读,所以解析就是阅读

3)※以给阅读器添加监听者的方式来设置具体的解析方案---该方案由"监听者"来决定

SAXParser sax = SAXParserFactory.newInstance().newSAXParser();
		XMLReader reader = sax.getXMLReader();

我们以后解析时真正需要写的就是下面这一小段有技术含量,其它都可以照搬

※给reader注册(添加)一个监听者,由监听者来设置解析方案

reader.setContentHandler(new DefaultHandler() {

			/*
			 * (non-Javadoc)
			 * 
			 * @see org.xml.sax.helpers.DefaultHandler#startDocument()
			 */
			@Override
			public void startDocument() throws SAXException {
				System.out.println("开始解析文档了.....");
			}

			/*
			 * (non-Javadoc)
			 * 
			 * @see org.xml.sax.helpers.DefaultHandler#endDocument()
			 */
			@Override
			public void endDocument() throws SAXException {
				System.out.println("文档解析结束了.....");
			}

			/*
			 * (non-Javadoc)
			 * 
			 * @see
			 * org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
			 * java.lang.String, java.lang.String, org.xml.sax.Attributes)
			 */
			@Override
			public void startElement(String uri, String localName,
					String qName, Attributes attributes) throws SAXException {
				System.out.println("一个元素开始,名字为:" + qName);
			}

			/*
			 * (non-Javadoc)
			 * 
			 * @see
			 * org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,
			 * java.lang.String, java.lang.String)
			 */
			@Override
			public void endElement(String uri, String localName, String qName)
					throws SAXException {
				System.out.println("一个元素结束,名字为:" + qName);
			}

		});

		// 解析动作的触发
		reader.parse("./xml/user3.xml");

eg.
   

@Test
	public void getInfoDemo() throws Exception {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		XMLReader reader = parser.getXMLReader();

		// //////设置解析方式///////////
		ContentHandler handler=new DefaultHandler(){
			 private String elementName="";

			/* (non-Javadoc)
			 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
			 */
			@Override
			public void startElement(String uri, String localName,
					String qName, Attributes attributes) throws SAXException {
				if("user".equals("qName")){
					String id=attributes.getValue("id");
					System.out.println("id:"+id);
				}else if("name".equals(qName) || "age".equals(qName)){
					elementName=qName;
				}
			}

			/* (non-Javadoc)
			 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
			 */
			@Override
			public void endElement(String uri, String localName, String qName)
					throws SAXException {
				if("name".equals(qName) || "age".equals(qName)){
					elementName="";
				}else if("user".equals(qName)){
					System.out.println("-----------------");
				}
			}

			/* (non-Javadoc)
			 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
			 */
			@Override
			public void characters(char[] ch, int start, int length)
					throws SAXException {
				if(!"".equals(elementName)){
					System.out.println(elementName+":"+new String(ch,start,length));
				}
			}
			 
			
		};
		
		reader.setContentHandler(handler);
		reader.parse("./xml/users.xml");
	}

 

StAX

@Test
	public void readDemo() throws Exception {
		// 先获得一个StAX阅读器
		XMLInputFactory factory = XMLInputFactory.newFactory();
		XMLEventReader reader = factory
				.createXMLEventReader(new FileInputStream("./xml/users.xml"));

		while (reader.hasNext()) {
			XMLEvent xv = reader.nextEvent();

			if (xv.isStartElement()) {
				StartElement se = xv.asStartElement();// 强转成"StartElement",以便于调用该类中的方法---定义了一些元素开始时可以做的动作
				if (se.getName().getLocalPart().equals("user")) {// <user>的开始标记
					// 属性是开始标签中的,因此这里的id属性直接从se中获取
					String id = se.getAttributeByName(new QName("id"))
							.getValue();
					System.out.println("id:" + id);
				} else if (se.getName().getLocalPart().equals("name")) { // <name>的开始标记
					// "文本内容"不属于"开始标签本身",而是它的孩子,因此"文本内容"是"开始标签"的下一个事件对象
					XMLEvent xvv = reader.nextEvent();
					// 因为我们知道evv就是文本内容,所以可以直接强转,以便于调用Characters类中的一些方法
					Characters chs = xvv.asCharacters();
					System.out.println("name:" + chs);
				} else if (se.getName().getLocalPart().equals("age")) { // <age>的开始标记
					Characters chs = reader.nextEvent().asCharacters();
					System.out.println("age:" + chs);
				}	
		}else if(xv.isEndElement()){
			EndElement ee = xv.asEndElement();
			if(ee.getName().getLocalPart().equals("user")){
				System.out.println("----------------");
			}
		}

	}
  }

 

 

 

猜你喜欢

转载自blog.csdn.net/lx678111/article/details/82049309