多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
javax中其实有自带的XML的解析的类,所以,如果需要简单地读取XML中的数据的话,可以不需要使用其他额外的包来完成: >##获取一个Document 一个简单的类,封装了基本的获取一个XML的Document实例的方法。 后面写的函数,都会调用这里哦,主要是方便。 ``` import org.w3c.dom.Document; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.StringReader; public class XMLBase { /* *流数据作为输入,构建Document */ public static Document getDoc(InputSource is){ try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.parse(is); return document; }catch (Exception e){ e.printStackTrace(); } return null; } /* *文件作为输入,构建Document */ public static Document getDoc(File is){ try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.parse(is); return document; }catch (Exception e){ e.printStackTrace(); } return null; } /* *字符串内容,构建Document */ public static Document getDoc(String xmlStr){ StringReader sr = new StringReader(xmlStr); InputSource is = new InputSource(sr); try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.parse(is); return document; }catch (Exception e){ e.printStackTrace(); } return null; } /* *将一个Document作为输入,返回XML的原文字符串 */ public static String xmlStr(Document doc){ try { TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); //将dom树转到流数据中 t.transform(new DOMSource(doc), new StreamResult(bos)); String xmlStr = bos.toString(); return xmlStr; }catch (Exception e){ e.printStackTrace(); } return null; } /* *将一个Document作为输入,返回XML的原文字符串,设置原文字符串的编码类型 */ public static String xmlStr(Document doc,String charset){ try { TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); //设置编码类型,一般用于解决中文字符乱码问题 t.setOutputProperty("encoding",charset); ByteArrayOutputStream bos = new ByteArrayOutputStream(); //将dom树转到流数据中 t.transform(new DOMSource(doc), new StreamResult(bos)); String xmlStr = bos.toString(); return xmlStr; }catch (Exception e){ e.printStackTrace(); } return null; } } ``` 有了Document,第二步骤,获取内容 >##获取内容 一个简单的Demo: ``` import org.w3c.dom.Document; public class DocDemo { static String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<学生名册>\n" + " <学生 学号=\"0001214\">\n" + " <姓名>张燕</姓名>\n" + " <性别>女</性别>\n" + " <年龄>22</年龄>\n" + " </学生>\n" + " \n" + " <学生 学号=\"0001239\">\n" + " <姓名>李继成</姓名>\n" + " <性别>男</性别>\n" + " <年龄>22</年龄>\n" + " </学生>\n" + " \n" + " <学生 学号=\"0001275\">\n" + " <姓名>华伟</姓名>\n" + " <性别>男</性别>\n" + " <年龄>22</年龄>\n" + " </学生>\n" + " \n" + "</学生名册>"; public static void main(String[] args){ demo(); } public static void demo(){ Document doc = XMLBase.getDoc(str); String str; str = doc.getElementsByTagName("姓名").item(0).getTextContent(); System.out.println(str); str = doc.getElementsByTagName("性别").item(0).getTextContent(); System.out.println(str); str = doc.getElementsByTagName("年龄").item(0).getTextContent(); System.out.println(str); } ``` 在这个demo中,我们可以看,我们很简单就读取到第一个便签为"姓名","性别","年龄"的内容。 更进一步 >##获取去更复杂的节点的内容 对于更复杂的操作,需要一层层定位的, 有两种方法: { 1.org.w3c.dom.{Node,Element,...}这里面的内容进行使用,来进行解析 2.javax.xml.xpath.XPath;这里面的内容来进行解析也是JDK自带的 } 对于第一种,不好用,所以不推荐,所以不讨论了,来看看第二种: 通过其JDK自带的Xpath ``` import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import java.io.IOException; public class XpathTest { //需要解析的String static String bookstore = "<bookstore>\n" + " <book category=\"COOKING\">\n" + " <title lang=\"en\">Everyday Italian</title>\n" + " <author>Giada De Laurentiis</author>\n" + " <year>2005</year>\n" + " <price>30.00</price>\n" + " </book>\n" + "\n" + " <book category=\"CHILDREN\">\n" + " <title lang=\"en\">Harry Potter</title>\n" + " <author>J K. Rowling</author>\n" + " <year>2005</year>\n" + " <price>29.99</price>\n" + " </book>\n" + "\n" + " <book category=\"WEB\">\n" + " <title lang=\"en\">Learning XML</title>\n" + " <author>Erik T. Ray</author>\n" + " <year>2003</year>\n" + " <price>39.95</price>\n" + " </book>\n" + " <book1 category=\"WEB\">\n" + " <title lang=\"en\">Learning XML</title>\n" + " <author>Erik T. Ray</author>\n" + " <year>2003</year>\n" + " <price>39.95</price>\n" + " </book1>\n" + " <url type =\"资料\">http://blog.csdn.net/dongfengkuayue/article/details/50240157</url>\n" + "</bookstore>"; //使用xpath对xml进行解析 public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException { // 解析文件,生成document对象 Document document = XMLBase.getDoc(bookstore); // 生成XPath对象 XPath xpath = XPathFactory.newInstance().newXPath(); // 获取节点值 String webTitle = (String) xpath.evaluate( "/bookstore/book[@category='WEB']/title/text()", document, XPathConstants.STRING); System.out.println(webTitle); System.out.println("==========================================================="); // 获取节点属性值 String webTitleLang = (String) xpath.evaluate( "/bookstore/book[@category='WEB']/title/@lang", document, XPathConstants.STRING); System.out.println(webTitleLang); System.out.println("==========================================================="); // 获取节点对象 Node bookWeb = (Node) xpath.evaluate( "/bookstore/book[@category='WEB']", document, XPathConstants.NODE); System.out.println(bookWeb.getNodeName()); System.out.println("==========================================================="); // 获取节点集合 NodeList books = (NodeList) xpath.evaluate("/bookstore/book", document, XPathConstants.NODESET); for (int i = 0; i < books.getLength(); i++) { Node book = books.item(i); System.out.println(xpath.evaluate("@category", book, XPathConstants.STRING)); } System.out.println("==========================================================="); //此处为是先找到一个节点,在该节点的基础上,继续下一层继续寻找,作为提高效率的一个思路 Node web_book = (Node)xpath.evaluate( "/bookstore/book[@category='WEB']", document, XPathConstants.NODE); String a =(String)xpath.evaluate( "title/text()", web_book,//#注意这里是web_book XPathConstants.STRING); System.out.println(a); } } ```