Jdom對xml文檔進行解析、生成、序列化等各種操作。
使用jdom之前,首先要導入jar包:jdom.jar?
獲得根元素:
//首先確定xml文件位置
?? ??? ?String xmlPath = "./src/ceshi/Test.xml";
?? ??? ?//使用的解析器,這里表示默認的解析器
?? ??? ?SAXBuilder builder = new SAXBuilder(false);
?? ??? ?try {
?? ??? ??? ?//得到Document,以后的操作都是Document操作的
?? ??? ??? ?Document document = builder.build(xmlPath);
? ? ? ? ? ? //得到根元素
?? ??? ??? ?Element root = document.getRootElement();
?? ??? ??? ?} catch (JDOMException e) {
?? ??? ??? ?e.printStackTrace();
?? ??? ?}?
Jdom得到的所有的節點,都是org.jdom.Element類,他的子節點也是org.jdom.Element類,得到的root是Element對象,直接輸出System.out.println(root);顯示:
[Element: <books/>]
Element的常用方法:
1、String ?getName() ?返回Element類的名稱?
System.out.println(root.getName()); 結果 :books
2、String ?getAttributeValue(Stringname) ? 獲得屬性值
System.out.println(root.getAttributeValue("size")); ?結果:3
3、setAttribute(String name,String value) ? 設置屬性值
4、removeAttribute(String name) ?刪除屬性
5、getAttributes().clear() ?清空所有屬性
6、String ?getText() ?獲得Element(當前節點)的值,當前節點必須是最后一級節點,否則返回空。
7、String ?getTextTrim() ?與getText()相同,只是去掉兩邊的空格
8、String ?setText(String ?name) ?改變Element(當前節點)的值,當前節點必須是最后一級節點。這個只是對document的修改,并沒有對實際的xml文檔修改。若要修改實際的文檔,需要使用XMLOutputter:
XMLOutputter outputter=new XMLOutputter();
outputter.output(document,new FileOutputStream(xmlPath));
9、Element ?getChild(String ?name) ?獲得指定名稱的第一個元素
10、 ? ? ? ? removeChildren(String ?name) ?刪除名稱為name的子元素
11、 ? ? ? ? addContent(Element ?e) ? 增加節點
?
?獲得子元素值:
//獲得根元素
? ?
輸出為:
? ? ?Elementroot = document.getRootElement();
? ? ? ? ?//通過根元素,獲得book元素
? ? ? ? ?Elementbook = root.getChild("book");
? ? ? ? ?//獲得book元素的name節點的值(name節點必須為最底層元素,否則返回空)
? ? ? System.out.println(book.getChildTextTrim("name"));?
java開發
getChild()獲得的是第一個元素。
獲得所有屬性:
節點可以獲得自己的屬性,對所有的屬性進行遍歷,然后轉換為屬性類型:
Attribute att = (Attribute) root.getAttributes().get(0);
?? ??? ?//獲得屬性名稱
?? ??? ?System.out.println(att.getName());
?? ??? ?//獲得屬性值
?? ?System.out.println(att.getValue());?
獲得子節點集合:
1、 獲得所有子節點
List childrens =root.getChildren();
? ? ? ? for(int i=0;i<childrens.size();i++){
? ? ? ? ? ?System.out.println(childrens.get(i));
? ? ? ?}
?
通過root.getChildren()得到的是一個List集合,集合中是Element對象:
[Element: <book/>]
[Element: <book/>]
[Element: <book/>]
得到的集合中的Element對象,需要進行類型轉換才能作為Element操作:
Element child0 = (Element) childrens.get(0);
System.out.println(child0.getName());
例如,對books所有子節點book遍歷屬性:
List childrens = root.getChildren();
for(inti=0;i<childrens.size();i++){
Element child= (Element) childrens.get(i);
System.out.println(child.getAttributeValue("author"));}
?
2、 獲得指定名稱的子節點
可以通過名稱獲得子節點,得到的同樣是Element集合,并且是所有的名稱為“name”的集合:
List childrens = book.getChildren("name");
生成xml文檔:
使用java定義各個節點以及屬性,然后生成xml文檔:
//定義所有節點
?? ??? ?Element root,student,number,name,age; ? ? ? ?
?? ??? ?Element student2,number2,name2,age2; ?
?? ??? ?
?? ??? ?//生成根元素:student-info
? ? ? ? root = new Element("student-info");?
? ? ? ??
? ? ? ? //生成元素:student(number,name,age) ? ? ?
? ? ? ? student = new Element("student"); ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? number = new Element("number");
? ? ? ? name = new Element("name");
? ? ? ? age = new Element("age");
? ? ? ? //生成元素:student2(number,name,age) ? ? ?
? ? ? ? student2 = new Element("student2"); ? ? ? ? ? ? ??
? ? ? ? number2 = new Element("number2");
? ? ? ? name2 = new Element("name2");
? ? ? ? age2 = new Element("age2");
? ? ? ? //將根元素植入文檔doc中
? ? ? ? Document doc = new Document(root);?
? ? ? ??
? ? ? ? //分別將兩個student賦值,然后分別加載到root上
? ? ? ? number.setText("001");
? ? ? ? name.setText("zs");
? ? ? ? age.setText("24");
? ? ? ? number2.setText("002");
number2.setAttribute(new Attribute("name","fxt"));//屬性
? ? ? ? name2.setText("ls");
? ? ? ? age2.setText("50");
? ? ? ? student.addContent(number);
? ? ? ? student.addContent(name);
? ? ? ? student.addContent(age);
? ? ? ? student2.addContent(number2);
? ? ? ? student2.addContent(name2);
? ? ? ? student2.addContent(age2);
? ? ? ? root.addContent(student);
? ? ? ? root.addContent(student2);
? ? ? ??
? ? ? ? //定義格式:字符為gb2312,縮進為4個空格(若Format報錯,說明版本太低,下載最新jdom.jar即可)
? ? ? ? Format format = Format.getCompactFormat();
? ? ? ? format.setEncoding("gb2312");?
? ? ? ? format.setIndent(" ? ?");?
? ? ? ??
? ? ? ? //輸出新文件,若已存在,則覆蓋
? ? ? ? XMLOutputter XMLOut = new XMLOutputter(format);
? ?XMLOut.output(doc, new FileOutputStream("./src/ceshi/jdomTest2.xml"));??
?