用JDOM简化XML编程

JDOM 使用标准的 Java 编码模式。只要有可能,它使用 Java new 操作符而不用复杂的工厂化模式,使对象操作即便对于初学用户也很方便。例如,让我们看一下如何随便使用 JDOM 建立一个简单的 XML 文档。我们将要建立的结构如清单 1 所示。
清单 1. 建立 XML 文档样本
<?xml version="1.0" encoding="UTF-8"?>
<car vin="123fhg5869705iop90">
  <!--Description of a car-->
  <make>Toyota</make>
  <model>Celica</model>
  <year>1997</year>
  <color>green</color>
  <license state="CA">1ABC234</license>
</car>

注意:我们将建立 示例文档,在下面的清单 2 到清单 7 中有详细描述。
开始,让我们先创建一个根元素,并将其添加到文档中:
清单 2. 创建一个 Document
Element carElement = new Element("car");
Document myDocument = new Document(carElement);

这一步创建一个新 org.jdom.Element ,并将其作为 org.jdom.Document myDocument 的根元素。因为一个 XML 文档必须一直有一个唯一的根元素,所以 Document 将 Element 放在它的构造器中。
下一步,添加 vin 属性:
清单 3. 添加一个 Attribute
carElement.addAttribute(new Attribute("vin", "123fhg5869705iop90"));

添加元素也是很简单的。这里我们添加 make 元素:
清单 4. 元素和子元素
Element make = new Element("make");
make.addContent("Toyota");
carElement.addContent(make);

由于 Element 的 addContent 方法返回 Element ,我们也可以这样写:
清单 5. 用简洁形式添加元素
carElement.addContent(new Element("make").addContent("Toyota"));

这两个语句完成了相同的工作。有些人认为第一个示例可读性更好,但是如果您一次建立许多元素,您会觉得第二个示例可读性更好。要完成构建文档:
清单 6. 添加其余的元素
carElement.addContent(new Element("model").addContent("Celica"));
carElement.addContent(new Element("year").addContent("1997"));
carElement.addContent(new Element("color").addContent("green"));
carElement.addContent(new Element("license")
    .addContent("1ABC234").addAttribute("state", "CA"));

您会注意到对于 license 元素,我们不但添加了元素的内容,还为其添加了一个属性,表明许可已被发出了这个状态。这是因为 Element 的 addContent 方法总是返回 Element 本身,而不是一个无效的声明。
用同样的方法添加注释部分或其它标准 XML 类型:
清单 7. 添加一条注释
carElement.addContent(new Comment("Description of a car"));

操作文档也是用类似方式。例如,要引用 year 元素,我们使用 Element 的 getChild 方法:
清单 8. 访问子元素
Element yearElement = carElement.getChild("year");

该语句实际上将返回第一个元素名为 year 的子 Element 。 如果没有 year 元素,则调用返回一个空值。注意,我们不必回溯来自任何类似于 DOM Node 接口的返回值 -- Element 的子元素就是 Element 。用类似的方式,我们可把 year 元素从文档中除去:
清单 9. 除去子元素
boolean removed = carElement.removeChild("year");

这次调用将只除去 year 元素;文档的其余部分保持不变。
到目前为止,我们已经涵盖了文档的生成和操作。要将完成的文档输出至控制台,可使用 JDOM 的 XMLOutputter 类:
清单 10. 将 JDOM 转化为 XML 文本
try {
    XMLOutputter outputter = new XMLOutputter("  ", true);
    outputter.output(myDocument, System.out);
} catch (java.io.IOException e) {
    e.printStackTrace();
}

XMLOutputter 有几个格式选项。这里我们已指定希望子元素从父元素缩进两个空格,并且希望元素间有空行。 XMLOutputter 可输出到 Writer 或 OutputStream 。为输出到文件,我们可以简单地将输出行简化为:
清单 11. 使用 FileWriter 输出 XML
FileWriter writer = new FileWriter("/some/directory/myFile.xml");
outputter.output(myDocument, writer);
writer.close();

JDOM解析XML
JDOM解析xml待解析的xml文件如下:
<?xml version="1.0" encoding="gb2312"?>
<books>
   <book email=zzjj@163.com>
     <name>zzjj</name>
     <price>60.0</price>
  </book>
</books
解析这个XML文件的Java文件:

public class JDomParse {
 public JDomParse(){
  String xmlpath="library.xml";
  SAXBuilder builder=new SAXBuilder(false);
  try {
   Document doc=builder.build(xmlpath);
   Element books=doc.getRootElement();
   List booklist=books.getChildren("book");
   for (Iterator iter = booklist.iterator(); iter.hasNext();) {
    Element book = (Element) iter.next();
    String email=book.getAttributeValue("email");
    System.out.println(email);
    String name=book.getChildTextTrim("name");
    System.out.println(name);
    book.getChild("name").setText("alterrjzjh");
    
   }
   
   XMLOutputter outputter=new XMLOutputter();
   outputter.output(doc,new FileOutputStream(xmlpath));
   
  } catch (JDOMException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 public static void main(String[] args) {
  new JDomParse();
 }
}

 
 使用JDOM首先要指定使用什么解析器。如:
   SAXBuilder builder=new SAXBuilder(false); 这表示使用的是默认的解析器

得到Document,以后要进行的所有操作都是对这个Document操作的:
   Document doc=builder.build(xmlpath);

得到根元素:
Element books=doc.getRootElement();
在JDOM中所有的节点(DOM中的概念)都是一个org.jdom.Element类,当然他的子节点也是一个org.jdom.Element类。

得到元素(节点)的集合:
   List booklist=books.getChildren("book");
这表示得到“books”元素的所在名称为“book”的元素,并把这些元素都放到一个List集合中

遍历List集合
    for (Iterator iter = booklist.iterator(); iter.hasNext();) {
       Element book = (Element) iter.next();
}

取得元素的属性:
    String email=book.getAttributeValue("email");
取得元素book的属性名为“email”的属性值。

取得元素的子元素(为最低层元素)的值:
    String name=book.getChildTextTrim("name");
注意的是,必须确定book元素的名为“name”的子元素只有一个。
改变元素(为最低层元素)的值:
    book.getChild("name").setText("alterrjzjh");
这只是对Document的修改,并没有在实际的XML文档中进行修改

保存Document的修改到XML文件中:
   XMLOutputter outputter=new XMLOutputter();
   outputter.output(doc,new FileOutputStream(xmlpath));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值