java解析xml的方式有使用dom解析通过dom对象以树状结构连接在一起;使用sax 解析它是遇到不同元素时会逐行解析;使用stax解析会从xml中提取所需的数据
xml是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。接下来将要在文章中为大家具体介绍在java中解析xml的方式,具有一定的参考作用,希望对大家有所帮助
【推荐课程:xml教程】
使用dom解析
dom解析器主要用于在内存中使用xml作为对象图(树状结构) 也就是文档对象模型(dom)。首先解析器遍历输入xml文件并创建与xml文件中的节点相对应的dom对象。这些dom对象以树状结构链接在一起。一旦解析器完成了解析过程,就会从中获得这个类似树的dom对象结构。
例:在所有代码示例中解析xml内容
public class domparserdemo { public static void main(string[] args) throws exception { documentbuilderfactory factory = documentbuilderfactory.newinstance(); documentbuilder builder = factory.newdocumentbuilder(); document document = builder.parse( classloader.getsystemresourceasstream("xml/employee.xml")); list<employee> emplist = new arraylist<>(); nodelist nodelist = document.getdocumentelement().getchildnodes(); for (int i = 0; i < nodelist.getlength(); i++) { node node = nodelist.item(i); if (node instanceof element) { employee emp = new employee(); emp.id = node.getattributes(). getnameditem("id").getnodevalue(); nodelist childnodes = node.getchildnodes(); for (int j = 0; j < childnodes.getlength(); j++) { node cnode = childnodes.item(j); if (cnode instanceof element) { string content = cnode.getlastchild(). gettextcontent().trim(); switch (cnode.getnodename()) { case "firstname": emp.firstname = content; break; case "lastname": emp.lastname = content; break; case "location": emp.location = content; break; } } } emplist.add(emp); } } for (employee emp : emplist) { system.out.println(emp); } }}class employee{ string id; string firstname; string lastname; string location; @override public string tostring() { return firstname+" "+lastname+"("+id+")"+location; }}
输出结果为:
rakesh mishra(111)bangalorejohn davis(112)chennairajesh sharma(113)pune
使用sax 解析
sax parser与dom解析器的不同之处在于sax解析器不会将完整的xml加载到内存中,而是在遇到不同的元素时,它逐行解析xml,c触发不同的事件,例如:打开标记,结束标记,字符数据,评论等。
使用sax parser解析xml的代码如下:
import java.util.arraylist;import java.util.list;import javax.xml.parsers.saxparser;import javax.xml.parsers.saxparserfactory;import org.xml.sax.attributes;import org.xml.sax.saxexception;import org.xml.sax.helpers.defaulthandler;public class saxparserdemo { public static void main(string[] args) throws exception { saxparserfactory parserfactor = saxparserfactory.newinstance(); saxparser parser = parserfactor.newsaxparser(); saxhandler handler = new saxhandler(); parser.parse(classloader.getsystemresourceasstream("xml/employee.xml"), handler); for ( employee emp : handler.emplist){ system.out.println(emp); } }}class saxhandler extends defaulthandler { list<employee> emplist = new arraylist<>(); employee emp = null; string content = null; @override public void startelement(string uri, string localname, string qname, attributes attributes) throws saxexception { switch(qname){ case "employee": emp = new employee(); emp.id = attributes.getvalue("id"); break; } } @override public void endelement(string uri, string localname, string qname) throws saxexception { switch(qname){ case "employee": emplist.add(emp); break; case "firstname": emp.firstname = content; break; case "lastname": emp.lastname = content; break; case "location": emp.location = content; break; } } @override public void characters(char[] ch, int start, int length) throws saxexception { content = string.copyvalueof(ch, start, length).trim(); } } class employee { string id; string firstname; string lastname; string location; @override public string tostring() { return firstname + " " + lastname + "(" + id + ")" + location; }}
输出结果为:
rakesh mishra(111)bangalorejohn davis(112)chennairajesh sharma(113)pune
使用stax parser
stax用于xml的streaming api,而stax parser与sa的不同之处在于sax parser。stax解析器也是一种与sax解析器也是有所不同的
sax parser会推送数据,但stax解析器会从xml中提取所需的数据。stax解析器将光标维持在文档中的当前位置,允许提取光标处可用的内容,而sax解析器在遇到某些数据时发出事件。
xmlinputfactory和xmlstreamreader是可用于加载xml文件的两个类。当我们使用xmlstreamreader读取xml文件时,事件以整数值的形式生成,然后将这些事件与xmlstreamconstants中的常量进行比较。以下代码显示了如何使用stax解析器解析xml:
import java.util.arraylist;import java.util.list;import javax.xml.stream.xmlinputfactory;import javax.xml.stream.xmlstreamconstants;import javax.xml.stream.xmlstreamexception;import javax.xml.stream.xmlstreamreader; public class staxparserdemo { public static void main(string[] args) throws xmlstreamexception { list<employee> emplist = null; employee curremp = null; string tagcontent = null; xmlinputfactory factory = xmlinputfactory.newinstance(); xmlstreamreader reader = factory.createxmlstreamreader( classloader.getsystemresourceasstream("xml/employee.xml")); while(reader.hasnext()){ int event = reader.next(); switch(event){ case xmlstreamconstants.start_element: if ("employee".equals(reader.getlocalname())){ curremp = new employee(); curremp.id = reader.getattributevalue(0); } if("employees".equals(reader.getlocalname())){ emplist = new arraylist<>(); } break; case xmlstreamconstants.characters: tagcontent = reader.gettext().trim(); break; case xmlstreamconstants.end_element: switch(reader.getlocalname()){ case "employee": emplist.add(curremp); break; case "firstname": curremp.firstname = tagcontent; break; case "lastname": curremp.lastname = tagcontent; break; case "location": curremp.location = tagcontent; break; } break; case xmlstreamconstants.start_document: emplist = new arraylist<>(); break; } } for ( employee emp : emplist){ system.out.println(emp); } }} class employee{ string id; string firstname; string lastname; string location; @override public string tostring(){ return firstname+" "+lastname+"("+id+") "+location; }}
输出结果为:
rakesh mishra(111) bangalorejohn davis(112) chennairajesh sharma(113) pune
总结:以上就是本篇文章的全部内容了,希望对大家有所帮助
以上就是java中解析xml的方式有哪些的详细内容。