【JAVA WEB】学习笔记——XML解析

    xiaoxiao2025-04-11  18

    解析方式:

    DOM解析 直接性把XML文档全部读取到内存中来,会得到一个Document对象,然后对其访问操作,DOM方式W3C推荐的一种方式 (好处:增删改查方便)SAX解析 Simple API for XML,不是官方的标准,但他是XML领域事实上的标准 SAX是边读取XML文档,边解析

    XML的解析器

    Crimson(SUN)Xerces(IBM -> Apache)Aelfred(JDOM, DOM4J)第三方解析工具 JDOM,DOM4J(常用)

    Java里面对XML的解析工具JAXP JAXP方式解析XML步骤:

    //获取 DocumentBuilderFactory 实例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //加载要解析的XML文档,获取Document对象 Document doc = db.parse(new FileInputStream("xmlfile/students.xml")); //对Document对象进行操作 //动态生成xml文档,并写入文件 //获取DocumentBuilderFactory实例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInsatence(); //通过Factory获取DocumentBuilder解析器对象实例 DocumentBuilder db = dbf.newDocumentBuilder(); //创建一个新的Document对象 Document doc = db.newDocument(); //添加一系列的元素 Element rootElt = doc.createElement("班级"); Element studentElt1 = doc.createElement("学生"); Element studentElt1 = doc.createElement("姓名"); studentElt1_name.setTextContent("张曼玉"); studentElt1_name.setAttribute("别名","玉姐"); Element studentElt1_sex = doc.createElement("姓名"); studentElt1_sex.setTextContent("女"); studentElt1.appendChild(studentElt1_name); studentElt1.appendChild(studentElt1_sex); Element studentElt2 = doc.createElement("学生"); Element studentElt2_name = doc.createElement("姓名"); studentElt2_name.setTextContent("林青霞"); studentElt2_name.setAtribute("别名","霞妹"); Element studentElt2_sex = doc.createElement("性别"); studentElt2_sex.setTextContent("女"); studentElt1.appendChild(studentElt1_name); studentElt1.appendChild(studentElt1_sex); rootElt.appendChild(studentElt1); rootElt.appendChild(studentElt2); doc.appendChild(rootElt); //获取TransfomerFactory实例 TransformerFatory tff = TransformerFactory.newInstance(); //通过TransfomerFactory创建Transformer实例 Transformer tf = tff.newTransformer(); //通过Document生成DOMSource实例 DOMSource sourse = new DOMSource(doc); //创建写DOM文档的输出流 StreamResult xmlResult = new StreamResult(new FileOutputStream("test.xml")); //通过Transfomer的transform方法把DOMSource对象写入输出流 tf.transform(source,xmlResult); JAXP方式解析XML步骤(SAX方式) SAX解析XML步骤 SAXPerserFactory spf = ASXPerserFactory.newInstance(); ASXParser sp = spf.newSAXParser(); sp.parse("test.xml",new MyHandler() ); SAX主要用于对XML文档解析,不能去修改、删除、添加元素 SAX是推行机制,把发现的内容告诉程序员(函数),程序员可以自己下决定如何处理 MyHandler接口: DefaultHandler SAX事件: startDoucment() 发现文档的开始,解析器开始扫描文件endDocument() 发现了文档尾startElement() 发现了一个起始标签,返回元素名,以及所有属性名和值character() 发现了一些文本,将得到一个字符数组,该字符数组的偏移量和长度变量,由这三个变量可以得到解析器发现的文本endElement() 发现一个结束标签,并返回元素名称

    DOM4J解析XML

    被解析的XML:

    <?xml version="1.0" encoding="UTF-8"?> <学生们> <学生> <学号>04142122</学号> <姓名>张三</姓名> </学生> <学生> <学号>04142138</学号> <姓名>李四</姓名> </学生> <学生> <学号>04156700</学号> <姓名>王五</姓名> </学生> <学生 学号="04149441" 姓名="马六" /> </学生们>

    JAVA代码(引入dom4j-1.6.1包):

    public class TestDOM4JParseXML { public static void main(String[] args) throws DocumentException { SAXReader reader = new SAXReader(); FileInputStream fis = null; try { fis = new FileInputStream("XMLDemo02.xml"); Document doc = reader.read(fis); //获取根元素 Element rootElt = doc.getRootElement(); System.out.println(rootElt.getName()); List elements = rootElt.elements(); System.out.println(elements.size()); for(int i=0 ; i<elements.size();i++){ Element elt = (Element)elements.get(i); System.out.println(elt.getName()); List attrList = elt.attributes(); for(int j=0 ; j<attrList.size() ; j++){ Attribute attr = (Attribute) attrList.get(j); System.out.println("\t属性" + attr.getName() + " = " + attr.getValue()); } List subEltList = elt.elements(); for(int j=0 ; j<subEltList.size(); ++j){ Element subElt = (Element) subEltList.get(j); System.out.println("\t子元素" + subElt.getName() + " : " + subElt.getText()); } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(fis != null){ try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }

    结果:

    学生们 4 学生 子元素学号 : 04142122 子元素姓名 : 张三 学生 子元素学号 : 04142138 子元素姓名 : 李四 学生 子元素学号 : 04156700 子元素姓名 : 王五 学生 属性学号 = 04149441 属性姓名 = 马六

    递归解析XML

    待解析xml

    <?xml version="1.0" encoding="UTF-8"?> <stuents id="123"> <student> <name length="12">张三</name> </student> <student> <name length="12">李四</name> </student> </stuents>

    java代码:

    public class TestDOM4JParseXML { public static void main(String[] args) { SAXReader reader = new SAXReader(); FileInputStream fis = null; try { fis = new FileInputStream("XMLDemo01.xml"); Document doc = reader.read(fis); Element rootElt = doc.getRootElement(); printElementDetail(rootElt,""); } catch (FileNotFoundException | DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { if(fis != null){ fis.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void printElementDetail(Element elt,String str){ System.out.print(str + elt.getName()); List<Attribute> attrList = elt.attributes(); int attrCount = attrList.size(); if(attrList.size() != 0){ System.out.print("["); for(int i=0 ; i<attrList.size() ; ++i){ Attribute attr = attrList.get(i); System.out.print(attr.getName()+" = "+attr.getValue()); if(i < attrCount - 1){ System.out.print(", "); } } System.out.print("]"); } String text = elt.getText().trim(); if(!"".equals(text)){ System.out.print(": "+text); } System.out.println(); List<Element> eltList = elt.elements(); for(int i=0 ;i<eltList.size() ; ++i){ Element subElt = eltList.get(i); printElementDetail(subElt,str + "\t"); } } }

    结果:

    stuents[id = 123] student name[length = 12]: 张三 student name[length = 12]: 李四

    生成XML

    public class DOM4JCreateXML { /** * 目标XML: * <select name="city"> * <option value="1">北京市</option> * <option value="2">天津市</option> * <option value="3">上海市</option> * <option value="4">重庆市</option> * </select> */ public static void main(String[] args) { //创建Document Document doc = DocumentHelper.createDocument(); Element rootElt = doc.addElement("select"); rootElt.addAttribute("name", "city"); Element cityElt1 = rootElt.addElement("option"); cityElt1.addAttribute("value", "1"); cityElt1.addText("北京市"); Element cityElt2 = rootElt.addElement("option"); cityElt2.addAttribute("value", "2"); cityElt2.addText("天津市"); Element cityElt3 = rootElt.addElement("option"); cityElt3.addAttribute("value", "3"); cityElt3.addText("上海市"); Element cityElt4 = rootElt.addElement("option"); cityElt4.addAttribute("value", "4"); cityElt4.addText("重庆市"); XMLWriter writer = null; FileWriter fw = null; try { fw = new FileWriter("city.xml"); //doc.write(fw);难以控制格式 OutputFormat format = OutputFormat.createPrettyPrint(); writer = new XMLWriter(fw,format); writer.write(doc); System.out.println("写入成功!"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if(fw!=null){ fw.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
    转载请注明原文地址: https://ju.6miu.com/read-1297958.html
    最新回复(0)