2013年12月28日 星期六

JDom解析XML範例

解析XML的方式有很多種,

以下介紹使用jdom套件的方式,

使用的版本為jdom-2.0.5.jar

首先是xml的資料檔案



<?xml version="1.0" encoding="UTF-8"?>
<root>
 <data>
  <member>
   <name>ABC</name>
   <id>A123456789</id>
  </member>
  <member>
   <name>D123</name>
   <id>D000000000</id>
  </member>
  <member>
   <name>E1069</name>
   <id>qwertyuiop</id>
  </member>
 </data>
 <config name="test" vender="T200">
  <remark>this is test</remark>
 </config>
</root>

接下來是解析的JAVA檔案,

詳細的API使用可參考註解部分,

package test.jdom;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class JdomMethod {
 /*
  * 將file檔案解析為jdom的Document
  */
 public Document saxparser(File file) throws JDOMException, IOException {
  return new SAXBuilder().build(file);
 }

 public void test() throws JDOMException, IOException {
  //解析檔案路徑
  String path = this.getClass().getClassLoader()
    .getResource("/xml/test1.xml").getPath();
  File file = new File(path);
  //取得從檔案解析的Document
  Document doc = saxparser(file);
  //取得根路徑
  Element root = doc.getRootElement();
  //取得data節點
  Element data = root.getChild("data");
  //取得所有data下member節點的list
  List<Element> list = data.getChildren("member");
  for (Element member : list) {
   //取節點值
   System.out.println(member.getChildText("name"));
   System.out.println(member.getChildText("id"));
   if (member.getChildText("name").equals("E1069")) {
    //設定節點值
    member.getChild("name").setText("EEEEE");
    //移除節點
    member.removeChild("id");
   }
  }
  Element config = root.getChild("config");
  //取得該元素的屬性值
  System.out.println("config.name = " + config.getAttributeValue("name"));
  //新增一個屬性值
  config.setAttribute(new Attribute("newAttr", "attr1"));
  //存回檔案
  output(doc, file);
 }

 /*
  * 將修改完成的Document存到File中
  */
 public void output(Document doc, File file) throws FileNotFoundException,
   IOException {
  new XMLOutputter(Format.getPrettyFormat()).output(doc,
    new FileOutputStream(file));
 }

}

console顯示的訊息
---------------------------------------
ABC
A123456789
D123
D000000000
E1069
qwertyuiop
config.name = test
---------------------------------------
最後附上修改完的xml資料
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <data>
    <member>
      <name>ABC</name>
      <id>A123456789</id>
    </member>
    <member>
      <name>D123</name>
      <id>D000000000</id>
    </member>
    <member>
      <name>EEEEE</name>
    </member>
  </data>
  <config name="test" vender="T200" newAttr="attr1">
    <remark>this is test</remark>
  </config>
</root>


沒有留言:

張貼留言