java-xml

jdk支持java 和xml 打交道,并且方式相当多。下面从两个角度说下java 和 xml的交互形式。

1、xml的解析。
xml的解析大抵有两种方式:
DOM 和 SAX 以及StAX。

DOM:就是基于w3c的DOM模型,在内存中读入一棵xml 的dom模型树结构。
相关api在:org.w3c.dom 包里。

SAX:基于事件解析的xml处理方式,每次遇到xml元素的时候,进行方法回调。
相关的api在:org.xml.sax 包里。

StAX:基于事件的xml解析方式,但是非回调。
相关api在:javax.xml.stream包里。

另外:StAX其实和SAX的处理的方式是一致的,都是基于事件, 只是SAX 是push 推的方式,由parse 调用 application的方式,而 StAX 则是相反由application调用parse,这种方式比较好理解,更符合我们程序的调用习惯。

JAXP: 意为Java API for XML Processing。因为 dom 和 sax 有多种实现方式,所以sun又提供了dom 和 sax的 工厂方法,一般建议使用JAXP的工厂方法的形式。
相关api在:javax.xml.parsers 包里。
api有:
   /** dom: jaxp通过下面两个工厂类,创建org.w3c.dom.Document 对象完成对xml的解析和处理。
   */
   javax.xml.parsers.DocumentBuilder;
   javax.xml.parsers.DocumentBuilderFactory;
   org.w3c.dom.Document ;
   /** sax:jaxp通过下面两个工厂类 创建 org.xml.sax.helpers.DefaultHandler进行回调解析完成xml的解析。
   */
   javax.xml.parsers.SAXParser;
   javax.xml.parsers.SAXParserFactory;
   org.xml.sax.helpers.DefaultHandler;


DOM举例:
public static void main(String[] args) throws Exception {
		// Document doc =
		// DocumentBuilderFactoryImpl.newInstance().newDocumentBuilder().newDocument();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document doc = builder
				.parse("D:\\qunarProject\\tts_tuan\\src\\test\\java\\com\\qunar\\test\\1.xml");
		NodeList nodeList = doc.getElementsByTagName("data");
		for (int i = 0; i < nodeList.getLength(); i++) {
			Element  ele = (Element)nodeList.item(i);
			NodeList list = ele.getChildNodes();
			for(int j =0;j<list.getLength();j++){
				Node  node = list.item(j);
				System.out.println("-:" + node.getNodeName());
				System.out.println("--:" + node.getTextContent());
			}
		}

	}



SAX举例:
public static void main(String[] args) throws Exception {
		SAXParser parse = SAXParserFactory.newInstance().newSAXParser();
		File f = new File(
				"D:\\qunarProject\\tts_tuan\\src\\test\\java\\com\\qunar\\test\\1.xml");
		parse.parse(f, new DefaultHandler() {
			@Override
			public void startDocument() throws SAXException {
				System.out.println("startDocument");
			}

			@Override
			public void endDocument() throws SAXException {
				System.out.println("endDocument");
			};

			@Override
			public void startElement(String uri, String localName,
					String qName, Attributes attributes) throws SAXException {
				System.out.println(localName);
			}

			@Override
			public void endElement(String uri, String localName, String qName)
					throws SAXException {
				System.out.println(localName);
			}

			@Override
			public void characters(char[] ch, int start, int length)
					throws SAXException {
				System.out.println(new String(ch, start, length));
			}
		});

	}


StAX举例:

<?xml version="1.0" encoding="UTF-8"?>
<data>
	aaa<name>admin</name>bbb
    ccc<password>123456</password>ddd
</data>

  public static void main(String[] args) throws Exception {
		InputStream in = new FileInputStream(
				"D:\\qunarProject\\tts_tuan\\src\\test\\java\\com\\qunar\\test\\1.xml");
		XMLInputFactory factory = XMLInputFactory.newInstance();
		XMLStreamReader parser = factory.createXMLStreamReader(in);
		while (true) {
			int event = parser.next();
			if (event == XMLStreamConstants.END_DOCUMENT) {
				parser.close();
				break;
			} else if (event == XMLStreamConstants.START_ELEMENT) {
				System.out.println(parser.getLocalName());
			} else if (event == XMLStreamConstants.CHARACTERS) {
				System.out.println(parser.getText());
			}else if (event == XMLStreamConstants.END_ELEMENT) {
				System.out.println(parser.getLocalName());
			}
		}
	}


2、xml的数据绑定。
是从java对象POJO和xml数据之间的转换的思路。 从面向对象的角度来处理javabean 和xml 数据的对象关系,在系统中经常使用。
  java提供的工业标准是:JAXB。

举例:

@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
class User{
	@XmlElement(name = "uname")
	private String username;
	@XmlElement(name = "pword")
	private String password;
	public User(String u,String p){
		this.username = u;
		this.password = p;
	}
	public User(){}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

@XmlRootElement(name = "team")
@XmlAccessorType(XmlAccessType.FIELD)
class Team{
	@XmlElementWrapper(name = "userList")
	@XmlElement(name = "user")
	private List<User> userList;
	public List<User> getUserList() {
		return userList;
	}
	public void setUserList(List<User> userList) {
		this.userList = userList;
	}
}

public class JaxbTest {
	public static void main(String[] args) throws Exception {
	 List<User> userList = new ArrayList<User>();
	 for(int i=0;i<2;i++){
		 userList.add(new User("name"+i,"pword"+i));
	 }
	 Team team = new Team();
	 team.setUserList(userList);
     JAXBContext context =  JAXBContext.newInstance(User.class,Team.class);
     Marshaller marshaller= context.createMarshaller();
     marshaller.marshal(team, System.out);
	}
}


输出:
<?xml version="1.0" encoding="utf-8"?>

<team>
  <userList>
    <user>
      <uname>name0</uname>
      <pword>pword0</pword>
    </user>
    <user>
      <uname>name1</uname>
      <pword>pword1</pword>
    </user>
  </userList>
</team>

你可能感兴趣的:(JAXB,dom,sax,StAX)