1、XML :(eXtensible Markup Language) 可扩展的标记语言,XML主要是为了传输和保存数据用的,可跨平台。
XML中的DTD :定义XML文件中的元素和属性 : Document Type Definition 文档类型定义
<!--
DTD定义:
<!DOCTYPE 根元素名 [
<!ELEMENT 元素名 (子元素)>
<!ELEMENT 元素名 元素类型>
<!ATTLIST 依附的元素名 属性名 属性类型 默认值>
]>
属性的类型:
ID :在标签中ID的值必须是唯一的值 ID类型的值不能是数字开头
CDATA: 可以是任意的字符串
枚举类型: 将尽可能的情况列举出来
默认值:
#REQUIRED:必须出现required
#IMPLIED :可以出现也可以不出现 implied
#FIXED: 固定值
-->
2、DOM4J: Document for Java ,底层已经封装好IO操作的一个第三方中间件。
3、解析XML
方法1:用dom4j解析XML
public static void main(String []args)throws Exception{//1 获得解析器对象 SAXReader reader = new SAXReader(); //2 通过解析器对象解析XML文件 File file = new File("test.xml"); Document doc = reader.read(file); //3 解析文件,得到根元素 Element root = doc.getRootElement(); //4 得到所有的一级子元素 List<Element> firsts = root.elements(); /* //中文解码,如果出现乱码可以这样解码,传入的不是个文件对象,而是个xml形式的String类型的串。 Document doc = DocumentHelper.parseText(URLDecoder.decode(xml, "UTF-8"));//xml是String类型 Element root= doc.getRootElement(); List<Element> firsts = root.elements(); //以下就相同了 */ for(Element e:firsts){ //得到当前一级子元素的所有的属性 List<Attribute> attrs = e.attributes(); for(Attribute a:attrs){ System.out.print("属性:"+a.getName()+"=\""+a.getValue()+"\"\t"); //getName() 可以得到属性的名称 getValue() 可以得到属性对应的值 } //得到对应的所有的二级子元素 List<Element> seconds = e.elements(); for(Element sec:seconds){ String eleName = sec.getName();//getName()也可以得到当前元素的名称 String eleText = sec.getText();//getText()用来得到某个元素的值 System.out.print("\n当前二级子元素名:"+eleName+" 内容是:"+eleText); } System.out.println(); } }
也可以用得到某个元素的值: String eleText = elementTextTrim("NAME");//
方法2、用jdom解析xml
try{ result = URLDecoder.decode(result, "UTF-8"); }catch (UnsupportedEncodingException e1){ e1.printStackTrace(); result = "中文字符转码错误"; } StringReader read = new StringReader(result); InputSource source = new InputSource(read); SAXBuilder sb = new SAXBuilder(); Document doc = sb.build(source); Element root = doc.getRootElement(); List firsts= root.getChildren("STUDENTINFO");//获取一级子元素 }catch (JDOMException e){ log.error(e); result = "解析失败"; }
dom4j和jdom大同小异,个人习惯用dom4j,只要能解决问题就行。