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,只要能解决问题就行。