CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  Web Services / XML

谁有JDOM操作XML的好例子?(添加,删除,修改 节点)

楼主GodSpeed513(GodSpeed513)2004-12-01 19:50:00 在 Java / Web Services / XML 提问

我最近写了一个JDOM操作XML的JAVA程序,在读节点的时候正常,可是修改一个节点的值时候,XML中各个节点会自动换行,每操作一次就回行一次,而且XML会越来越大!   :(  
  希望谁能给我一个JDOM操作XML的好例子?(添加,删除,修改   节点)  
   
  先谢谢了! 问题点数:100、回复次数:16Top

1 楼vcvj([Reside]in Fuzhou, [Gonna]be Oversea, [Depositing)回复于 2004-12-02 08:45:34 得分 10

I   suggest   that   you   try   to   use   DOM,   I   have   never   met   problems   of   yours.  
  download   a   MSXML   SDK   for   javascript,it   was   refered   only.  
  as   far   as   JAVA,   JDK1.4   has   included   itself.Top

2 楼NetSniffer(扑克)回复于 2004-12-02 08:46:57 得分 0

refer   to   its   documentation~Top

3 楼zcjl()回复于 2004-12-02 08:53:24 得分 40

可是修改一个节点的值时候,XML中各个节点会自动换行  
  ----------------------------------------------  
  写回xml时会换行是不是?  
  用下面的代码就不会了  
  关键是:  
  XMLOutputter   outputter   =   new   XMLOutputter("",   false,   encoding);  
                                                                                              *****  
   
  public   void   OutputToFile(Document   doc,   String   filePath,   String   encoding)   {  
          try   {  
                  XMLOutputter   outputter   =   new   XMLOutputter("",   false,   encoding);  
                  FileWriter   writer   =   new   FileWriter(filePath);  
                  outputter.output(doc,   writer);  
                  writer.close();  
          }   catch   (java.io.IOException   e)   {  
                  e.printStackTrace();  
          }  
  }Top

4 楼YUAN168(风平浪静真好......)回复于 2004-12-02 11:53:18 得分 0

有沒有人認識兩個人,姓別:男,A:   陳豐,湖北天門人,以前在北京,現不知去向  
                                                              B:賴劍崇,廣東河源人,以前在深圳,現不知去向  
  如有知情者請:YVBNET@163.COM,重酬!  
  Top

5 楼zcjl()回复于 2004-12-02 11:59:43 得分 0

到这里登寻人启事??  
  不过不认识这两人,抱歉!Top

6 楼zh_baiyu(SkyBay)回复于 2004-12-02 12:02:47 得分 10

hehe   ..   尋人啓示?Top

7 楼123xxx(香克斯)回复于 2004-12-02 12:09:39 得分 0

http://www.csdn.net/Develop/Read_Article.asp?Id=20649  
  有很详细地介绍Top

8 楼GodSpeed513(GodSpeed513)回复于 2004-12-02 13:53:08 得分 0

我是这样写的,不知道问题在哪?(老是会自动换行)  
   
  //设置合法信息  
  public   void   setLegality(String   sLegality){  
  try{  
          Element   opBook=(Element)nl.item(0);  
                          opBook.getElementsByTagName("Legality").item(0).getFirstChild().setNodeValue(sLegality);  
                          ((XmlDocument)doc).write(new   FileOutputStream(new   File(xmlFileName)));  
          }catch(Exception   e){  
          e.printStackTrace();  
          }  
  }Top

9 楼zcjl()回复于 2004-12-02 14:03:18 得分 0

这是用的jdom么?  
  我怎么看着那么眼生啊?Top

10 楼vcvj([Reside]in Fuzhou, [Gonna]be Oversea, [Depositing)回复于 2004-12-02 14:20:13 得分 0

it's   DOM.Top

11 楼zcjl()回复于 2004-12-02 14:58:29 得分 0

呵呵,这正是vcvj兄擅长的Top

12 楼vcvj([Reside]in Fuzhou, [Gonna]be Oversea, [Depositing)回复于 2004-12-02 15:08:30 得分 0

:------)Top

13 楼GodSpeed513(GodSpeed513)回复于 2004-12-03 00:18:01 得分 0

DOM中可以解决换行这个问题吗?Top

14 楼shengchunhua()回复于 2004-12-03 14:36:53 得分 40

JDOM   介绍及使用指南  
   
  一、JDOM   简介  
  JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。  
  JDOM   直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。  
  在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。  
  JDOM   在2000年的春天被Brett   McLaughlin和Jason   Hunter开发出来,以弥补DOM及SAX在实际应用当中的不足之处。  
  这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说,JAVA程序员在使用时来用起来总觉得不太方便。  
  DOM的缺点主要是来自于由于Dom是一个接口定义语言(IDL),它的任务是在不同语言实现中的一个最低的通用标准,并不是为JAVA特别设计的。JDOM的最新版本为JDOM   Beta   9。最近JDOM被收录到JSR-102内,这标志着JDOM成为了JAVA平台组成的一部分。  
   
   
  二、JDOM   包概览  
  JDOM是由以下几个包组成的  
  org.JDOM  
  org.JDOM.input  
  org.JDOM.output  
  org.JDOM.adapters  
  org.JDOM.transform  
   
  三、JDOM   类说明  
   
  org.JDOM  
  这个包里的类是你解析xml文件后所要用到的所有数据类型。  
  Attribute  
  CDATA  
  Coment  
  DocType  
  Document  
  Element  
  EntityRef  
  Namespace  
  ProscessingInstruction  
  Text  
   
  org.JDOM.transform  
  在涉及xslt格式转换时应使用下面的2个类  
  JDOMSource  
  JDOMResult  
   
  org.JDOM.input  
  输入类,一般用于文档的创建工作  
  SAXBuilder  
  DOMBuilder  
  ResultSetBuilder  
   
  org.JDOM.output  
  输出类,用于文档转换输出  
  XMLOutputter  
  SAXOutputter  
  DomOutputter  
  JTreeOutputter  
   
  使用前注意事项:  
  1.JDOM对于JAXP   以及   TRax   的支持  
  JDOM   支持JAXP1.1:你可以在程序中使用任何的parser工具类,默认情况下是JAXP的parser。  
  制定特别的parser可用如下形式  
  SAXBuilder   parser    
      =   new   SAXBuilder("org.apache.crimson.parser.XMLReaderImpl");  
    Document   doc   =   parser.build("http://www.cafeconleche.org/");  
    //   work   with   the   document...  
  JDOM也支持TRaX:XSLT可通过JDOMSource以及JDOMResult类来转换(参见以后章节)  
  2.注意在JDOM里文档(Document)类由org.JDOM.Document   来表示。这要与org.w3c.dom中的Document区别开,这2种格式如何转换在后面会说明。  
  以下如无特指均指JDOM里的Document。Top

15 楼shengchunhua()回复于 2004-12-03 14:37:03 得分 0

四、JDOM主要使用方法  
  1.Ducument类  
  (1)Document的操作方法:  
  Element   root   =   new   Element("GREETING");  
  Document   doc   =   new   Document(root);  
  root.setText("Hello   JDOM!");  
  或者简单的使用Document   doc   =   new   Document(new   Element("GREETING").setText("Hello   JDOM!t"));  
   
  这点和DOM不同。Dom则需要更为复杂的代码,如下:  
  DocumentBuilderFactory   factory   =DocumentBuilderFactory.newInstance();  
  DocumentBuilder   builder   =factory.newDocumentBuilder();  
  Document   doc   =   builder.newDocument();  
  Element   root   =doc.createElement("root");  
  Text   text   =   doc.createText("This   is   the   root");  
  root.appendChild(text);  
  doc.appendChild(root);  
   
   
  注意事项:JDOM不允许同一个节点同时被2个或多个文档相关联,要在第2个文档中使用原来老文档中的节点的话。首先需要使用detach()把这个节点分开来。  
   
  (2)从文件、流、系统ID、URL得到Document对象:  
  DOMBuilder   builder   =   new   DOMBuilder();  
  Document   doc   =   builder.build(new   File("jdom_test.xml"));  
   
  SAXBuilder   builder   =   new   SAXBuilder();  
  Document   doc   =   builder.build(url);  
  在新版本中DOMBuilder   已经Deprecated掉   DOMBuilder.builder(url),用SAX效率会比较快。  
   
  这里举一个小例子,为了简单起见,使用String对象直接作为xml数据源:  
   
    public   jdomTest()   {  
          String   textXml   =   null;  
          textXml   =   "<note>";  
          textXml   =   textXml   +  
                  "<to>aaa</to><from>bbb</from><heading>ccc</heading><body>ddd</body>";  
          textXml   =   textXml   +   "</note>";  
          SAXBuilder   builder   =   new   SAXBuilder();  
          Document   doc   =   null;  
          Reader   in=   new   StringReader(textXml);  
          try   {  
              doc   =   builder.build(in);  
              Element   root   =   doc.getRootElement();  
              List   ls   =   root.getChildren();//注意此处取出的是root节点下面的一层的Element集合  
              for   (Iterator   iter   =   ls.iterator();   iter.hasNext();   )   {  
                  Element   el   =   (Element)   iter.next();  
                  if(el.getName().equals("to")){  
                    System.out.println(el.getText());  
                  }  
              }  
          }  
          catch   (IOException   ex)   {  
              ex.printStackTrace();  
          }  
          catch   (JDOMException   ex)   {  
              ex.printStackTrace();  
          }  
      }  
   
  很简单把。  
   
   
  (3)DOM的document和JDOM的Document之间的相互转换使用方法,简单!  
  DOMBuilder   builder   =   new   DOMBuilder();  
  org.jdom.Document   jdomDocument   =   builder.build(domDocument);  
  //   work   with   the   JDOM   document…  
   
  DOMOutputter   converter   =   new   DOMOutputter();  
  org.w3c.dom.Document   domDocument   =   converter.output(jdomDocument);  
  //   work   with   the   DOM   document…  
   
  2.XML文档输出  
  XMLOutPutter类:  
  JDOM的输出非常灵活,支持很多种io格式以及风格的输出  
  Document   doc   =   new   Document(...);  
  XMLOutputter   outp   =   new   XMLOutputter();  
  //   Raw   output  
  outp.output(doc,   fileOutputStream);  
  //   Compressed   output  
  outp.setTextTrim(true);  
  outp.output(doc,   socket.getOutputStream());  
  //   Pretty   output  
  outp.setIndent("   ");  
  outp.setNewlines(true);  
  outp.output(doc,   System.out);  
  ......  
  详细请参阅最新的JDOM   API手册Top

16 楼shengchunhua()回复于 2004-12-03 14:37:19 得分 0

3.Element   类:  
  (1)浏览Element树  
  //获得根元素element  
  Element   root   =   doc.getRootElement();  
  //   获得所有子元素的一个list  
  List   allChildren   =   root.getChildren();  
  //   获得指定名称子元素的list  
  List   namedChildren   =   root.getChildren("name");  
  //获得指定名称的第一个子元素  
  Element   child   =   root.getChild("name");  
  (这里的List是java.util.List)  
   
  JDOM给了我们很多很灵活的使用方法来管理子元素  
  List   allChildren   =   root.getChildren();  
  //   删除第四个子元素  
  allChildren.remove(3);  
  //   删除叫“jack”的子元素  
  allChildren.removeAll(root.getChildren("jack"));  
   
  root.removeChildren("jack");   //   便捷写法  
  //   加入  
  allChildren.add(new   Element("jane"));  
   
  root.addContent(new   Element("jane"));   //   便捷写法  
  allChildren.add(0,   new   Element("first"));  
   
   
  (2)移动Elements:  
  在JDOM里很简单  
  Element   movable   =   new   Element("movable");  
  parent1.addContent(movable);   //   place  
  parent1.removeContent(movable);   //   remove  
  parent2.addContent(movable);   //   add  
   
  在Dom里  
  Element   movable   =   doc1.createElement("movable");  
  parent1.appendChild(movable);   //   place  
  parent1.removeChild(movable);   //   remove  
  parent2.appendChild(movable);   //   出错!  
   
  补充:  
  纠错性  
  JDOM的Element构造函数(以及它的其他函数)会检查element是否合法。  
  而它的add/remove方法会检查树结构,检查内容如下:  
  1.在任何树中是否有回环节点  
  2.是否只有一个根节点  
  3.是否有一致的命名空间(Namespaces)  
   
     
   
  (3)Element的text内容读取  
  <description>  
  A   cool   demo  
  </description>  
   
  //   The   text   is   directly   available  
  //   Returns   "\n   A   cool   demo\n"  
  String   desc   =   element.getText();  
   
  //   There's   a   convenient   shortcut  
  //   Returns   "A   cool   demo"  
  String   desc   =   element.getTextTrim();  
   
  (4)Elment内容修改  
  element.setText("A   new   description");  
  3.可正确解释特殊字符  
  element.setText("<xml>   content");  
  4.CDATA的数据写入、读出  
  element.addContent(new   CDATA("<xml>   content"));  
  String   noDifference   =   element.getText();  
   
  混合内容  
  element可能包含很多种内容,比如说  
   
  <table>  
  <!--   Some   comment   -->  
  Some   text  
  <tr>Some   child   element</tr>  
  </table>  
   
  取table的子元素tr  
  String   text   =   table.getTextTrim();  
  Element   tr   =   table.getChild("tr");  
   
  也可使用另外一个比较简单的方法  
  List   mixedCo   =   table.getContent();  
  Iterator   itr   =   mixedCo.iterator();  
  while   (itr.hasNext())   {  
  Object   o   =   i.next();  
  if   (o   instanceof   Comment)   {  
  ...  
  }  
  //   这里可以写成Comment,   Element,   Text,   CDATA,ProcessingInstruction,   或者是EntityRef的类型  
  }  
  //   现在移除Comment,注意这里游标应为1。这是由于回车键也被解析成Text类的缘故,所以Comment项应为1。  
  mixedCo.remove(1);  
   
     
   
  4.Attribute类  
  <table   width="100%"   border="0">   </table>  
  //获得attribute  
  String   width   =   table.getAttributeValue("width");  
  int   border   =   table.getAttribute("width").getIntValue();  
  //设置attribute  
  table.setAttribute("vspace",   "0");  
  //   删除一个或全部attribute  
  table.removeAttribute("vspace");  
  table.getAttributes().clear();  
   
     
   
  5.处理指令(Processing   Instructions)操作  
  一个Pls的例子  
  <?br?>  
  <?cocoon-process   type="xslt"?>  
                      |                 |  
                      |                 |  
                  目标           数据  
   
  处理目标名称(Target)  
  String   target   =   pi.getTarget();  
  获得所有数据(data),在目标(target)以后的所有数据都会被返回。  
  String   data   =   pi.getData();  
  获得指定属性的数据  
  String   type   =   pi.getValue("type");  
  获得所有属性的名称  
  List   ls   =   pi.getNames();  
   
  6.命名空间操作  
  <xhtml:html    
    xmlns:xhtml="http://www.w3.org/1999/xhtml">  
  <xhtml:title>Home   Page</xhtml:title>  
  </xhtml:html>  
   
  Namespace   xhtml   =   Namespace.getNamespace("xhtml",   "http://www.w3.org/1999/xhtml");  
  List   kids   =   html.getChildren("title",   xhtml);  
  Element   kid   =   html.getChild("title",   xhtml);  
  kid.addContent(new   Element("table",   xhtml));  
   
  7.XSLT格式转换  
  使用以下函数可对XSLT转换  
  最后如果你需要使用w3c的Document则需要转换一下。  
  public   static   Document   transform(String   stylesheet,Document   in)  
                                                                                  throws   JDOMException   {  
            try   {  
                Transformer   transformer   =   TransformerFactory.newInstance()  
                                                            .newTransformer(new   StreamSource(stylesheet));  
                JDOMResult   out   =   new   JDOMResult();  
                transformer.transform(new   JDOMSource(in),   out);  
                return   out.getDeocument();  
            }  
            catch   (TransformerException   e)   {  
                throw   new   JDOMException("XSLT   Trandformation   failed",   e);  
            }  
        }Top

相关问题

  • XML节点删除的问题 Help
  • 怎么在XML增加节点与删除节点
  • XML节点内容删除怎么删除啊
  • 求在jdom下删除节点的方法
  • 删除XML子节点时为什么会剩下一空节点?
  • Tree删除节点~
  • 如何在xml数据源中删除节点
  • 如何在xml数据源中删除节点
  • xml数据源的确问题(将空节点删除)
  • 关于用js删除xml节点的问题。

关键词

  • w3c

得分解答快速导航

  • 帖主:GodSpeed513
  • vcvj
  • zcjl
  • zh_baiyu
  • shengchunhua

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo