java-xml

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

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

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

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

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

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

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());
}
}
}


[b]2、xml的数据绑定。[/b]
是从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);
}
}


输出:
[code]
<?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>

[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值