用Java处理 XML 数据

发表于:2014-1-14 10:09

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:lj0425    来源:51Testing软件测试网采编

  看起来这是个常规性的动作。不知道什么时候你就需要用JAVA处理一下XML。
  虽说现在用XML作为媒体进行数据交换不是那么有效率(你可以试着Google “为啥不用XML” 之类的了解了解),不过鉴于很多古板的系统只能支持长胡子的技术实现,所以这方面也要照顾一下退休人士。
  了解背景会让你聊天的时候显得牛一些。
  Java原生内置的处理XML的技术基本有这么几种:DOM,SAX,Stax,Jaxb
  DOM :Document Object Model 顾名思义就是在内存中构建树形结构。处理小的XML文件还算勉强应付。如果文件比较大,他需要一次性装载整个XML,你会忍不了他的速度,并且他会吃光你所有的内存,最后程序会负分滚粗。
  SAX:Simple API for XML Parsing 一般名字应该是没实现的愿望体现。比如一个人如果叫王金库,那么可以肯定他绝对没有金库。这样你应该理解这个API为啥叫Simple了。这API是回调式的,也就是你写的程序是被别人调戏用的。这API比DOM快点,而且是可以部分装载XML,这样你不用害怕OOME了。啥?你想写XML?忘掉这个叫Simple的玩意儿吧。
  Stax: Streaming API for XML 这个总算是靠点谱了。你写的程序是主动式的访问XML各个节点。流式访问,不用担心OOME,速度嘛算是原生态里面最好的了。而且读写都支持,你不用这个还用哪个啊?
  给个Stax的代码片段,算是参考吧:
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml"));
xsr.nextTag(); // Advance to statements element
long i = 0;
String action = null;
while (xsr.hasNext()) {
if (xsr.next() == XMLStreamConstants.START_ELEMENT) {
if ("ContentItem".equals(xsr.getLocalName())) {
action = getAttributeValue(xsr, "action");
} else if ("Data".equals(xsr.getLocalName())) {
i ++;
}
}
}
  JAXB:Java Architecture for XML Binding 这是一个很酷的API。想法就是把XML各种属性定义映射到普通的Java Bean上。你无须关心解析反解析的细节,只要用普通的Java Bean就完成和XML的交互了。可是怎么构建一一映射的JavaBean呢?在已知XML的定义的情况下你可以用自带的xjc 命令自动生成相对应的JavaBean。如果你用Eclipse,有类似的插件帮你完成这步。具体可以google一下。然后你要做的就是仅仅是使用数据啦。简单的令人发指:
JAXBContext jc = JAXBContext.newInstance("com.your.xml.datatype.bean"); // 先注册你的JavaBean
// Create unmarshaller
Unmarshaller um = jc.createUnmarshaller();
// Unmarshal XML contents of the file myDoc.xml into your Java object
// instance
ObjectFactory objFac = new ObjectFactory(); // 生成Bean之后你会有这个工厂类的
objFac.createYourData(objFac.createYourDataType());
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("your.xml")); // 你要怎么打开你的XML文件呢?
JAXBElement myJAXBObject = (JAXBElement) um.unmarshal(bis); // 读取
YourDataType yourData = (YourDataType) myJAXBObject.getValue(); // 可以用啦
// 下面是写XML的例子
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
File outfile = new File("yourOutput.xml");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outfile), 4096);
m.marshal(myJAXBObject, bos); // 一步写入。 myJAXBObject 需要你自己构建,你要存什么呢
try {
bos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
bos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号