新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论DOM, SAX, XPath等。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DOM/SAX/XPath 』 → 一个值得探讨的DOM问题 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 15672 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 一个值得探讨的DOM问题 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     1702king 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:79
      门派:XML.ORG.CN
      注册:2005/4/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给1702king发送一个短消息 把1702king加入好友 查看1702king的个人资料 搜索1702king在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看1702king的博客楼主
    发贴心情 一个值得探讨的DOM问题

    我的程序是这样的:
    /*******intro.xml************/
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE myMessage [
    <!ELEMENT myMessage (message)>
    <!ELEMENT message (#PCDATA)>
    ]>
    <myMessage>
    <message>Welcome to XML!</message>
    </myMessage>


    /*******ReplaceText.java(Read intro.xml)*************/
    import java.io.*;
    import org.w3c.dom.*;
    import javax.xml.parsers.*;
    import org.apache.crimson.tree.XmlDocument;
    import org.xml.sax.*;

    public class ReplaceText
    {
    private Document document;

    public ReplaceText()
    {
      try
      {
       DocumentBuilderFactory factory=
        DocumentBuilderFactory.newInstance();
       factory.setValidating(true);
       DocumentBuilder builder=factory.newDocumentBuilder();
       builder.setErrorHandler(new MyErrorHandler());
       document=builder.parse(new File("intro.xml"));
       
       Node root=document.getDocumentElement();

       if (root.getNodeType()==Node.ELEMENT_NODE)
       {
        Element myMessageNode=(Element)root;
        NodeList messageNodes=myMessageNode.getElementsByTagName("message");

        if (messageNodes.getLength()!=0)
        {
         Node message=messageNodes.item(0);
         Text newText=document.createTextNode("New Changed Message!");
         Text oldText=(Text)message.getChildNodes().item(0);
         message.replaceChild(newText,oldText);
        }
       }
       ((XmlDocument)document).write(new FileOutputStream(intro1.xml));
      }catch(SAXParseException spe)
      {
       System.err.println("Parse Error:"+spe.getMessage());
       System.exit(1);
      }catch(SAXException se)
      {
       se.printStackTrace();
      }catch(FileNotFoundException fne)
      {
       System.err.println("File \'intro.xml\' not Found.");
       System.exit(1);
      }catch(Exception e)
      {
       e.printStackTrace();
      }
    }

    public static void main(String args[])
    {
      ReplaceText d=new ReplaceText();
    }
    };


    /************Error Handler for validation errors.***********/
    import org.xml.sax.ErrorHandler;
    import org.xml.sax.SAXException;
    import org.xml.sax.SAXParseException;

    public class MyErrorHandler implements ErrorHandler
    {
    public void fatalError(SAXParseException exception)throws SAXException
    {
      throw exception;
    }
    public void error(SAXParseException e)throws SAXParseException
    {
      throw e;
    }
    public void warning(SAXParseException err)throws SAXParseException
    {
      System.err.println("Warning:"+err.getMessage());
    }
    };


    运行:javac ReplaceText.java MyErrorHandler.java
    编译通过了
    运行:java ReplaceText
    提示错误:java.lang.ClassCastException
    错误指向这两行:
    ((XmlDocument)document).write(new FileOutputStream(intro1.xml));
    ReplaceText d=new ReplaceText();

    请问该怎样解决呢?


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/26 21:33:00
     
     1702king 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:79
      门派:XML.ORG.CN
      注册:2005/4/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给1702king发送一个短消息 把1702king加入好友 查看1702king的个人资料 搜索1702king在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看1702king的博客2
    发贴心情 
    注释的程序:
    // Reads intro.xml and replaces a text node.

    import java.io.*;
    import org.w3c.dom.*;
    import javax.xml.parsers.*;
    //import com.sun.xml.tree.XmlDocument;
    import org.apache.crimson.tree.XmlDocument;
    import org.xml.sax.*;

    public class ReplaceText {
       private Document document;

       public ReplaceText()
       {
          try {

             // obtain the default parser
             DocumentBuilderFactory factory =
                DocumentBuilderFactory.newInstance();

             // set the parser to validating           
             factory.setValidating( true );
         
             DocumentBuilder builder = factory.newDocumentBuilder();

             // set error handler for validation errors
             builder.setErrorHandler( new MyErrorHandler() );

             // obtain document object from XML document
             document = builder.parse( new File( "intro.xml" ) );

             // fetch the root node
             Node root = document.getDocumentElement();

             if ( root.getNodeType() == Node.ELEMENT_NODE ) {
                Element myMessageNode = ( Element ) root;
                NodeList messageNodes =
                   myMessageNode.getElementsByTagName( "message" );

                if ( messageNodes.getLength() != 0 ) {
                   Node message = messageNodes.item( 0 );

                   // create a text node
                   Text newText = document.createTextNode(
                                    "New Changed Message!!" );

                   // get the old text node
                   Text oldText =
                      ( Text ) message.getChildNodes().item( 0 );  

                   // replace the text
                   message.replaceChild( newText, oldText );
                }
             }            
            
             ( (XmlDocument) document).write( new FileOutputStream(
                 "intro2.xml" ) );  
          }
          catch ( SAXParseException spe ) {
             System.err.println( "Parse error: " +
                spe.getMessage() );
             System.exit( 1 );
          }
          catch ( SAXException se ) {
             se.printStackTrace();         
          }
          catch ( FileNotFoundException fne ) {
             System.err.println( "File \'intro.xml\' not found. " );
             System.exit( 1 );
          }
          catch ( Exception e ) {
             e.printStackTrace();
          }
       }
       
       public static void main( String args[] )
       {
          ReplaceText d = new ReplaceText();    
       }
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/26 21:37:00
     
     1702king 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:79
      门派:XML.ORG.CN
      注册:2005/4/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给1702king发送一个短消息 把1702king加入好友 查看1702king的个人资料 搜索1702king在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看1702king的博客3
    发贴心情 
    简单一点的另外一个程序:(也是同样的错误...编译能通过...运行时出错)
    运行:javac BuildXml.java(编译通过)
    运行:java BuildXml(出错)
    Exception in thread "main" java.lang.ClassCastException
            at BuildXml.<init><BuildXml.java:40>
            at BuildXml.main<BuildXml.java:69>

    import java.io.*;
    import org.w3c.dom.*;
    import org.xml.sax.*;
    import javax.xml.parsers.*;
    import org.apache.crimson.tree.XmlDocument;

    public class BuildXml
    {
     private Document document;
     
     public BuildXml()
     {
      DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
      try
      {
       DocumentBuilder builder=factory.newDocumentBuilder();
       document=builder.newDocument();
      }catch(ParserConfigurationException pce)
      {
       pce.printStackTrace();
      }
      
      Element root=document.createElement("root");
      document.appendChild(root);
      
      Comment simpleComment=document.createComment("This is a simple contact list");
      root.appendChild(simpleComment);

      Node contactNode=createContactNode(document);
      root.appendChild(contactNode);

      ProcessingInstruction pi=document.createProcessingInstruction("myInstruction","action list");
      root.appendChild(pi);

      CDATASection cdata=document.createCDATASection("I can add <, >, and ?" );
      root.appendChild(cdata);

      try
      {
       ((XmlDocument)document).write(new FileOutputStream("myDocument.xml"));
      }catch(IOException ioe)
      {
       ioe.printStackTrace();
      }
     }

     public Node createContactNode(Document document)
     {
      Element firstElement=document.createElement("FirstName");
      Element lastElement=document.createElement("LastName");

      firstElement.appendChild(document.createTextNode("Sue"));
      lastElement.appendChild(document.createTextNode("Green"));

      Element contact=document.createElement("contact");

      Attr genderAttribute=document.createAttribute("gender");
      genderAttribute.setValue("F");

      contact.setAttributeNode(genderAttribute);
      contact.appendChild(firstElement);
      contact.appendChild(lastElement);
      
      return contact;
     }

     public static void main(String args[])
     {
      BuildXml buildXml=new BuildXml();
     }
    };


    另外XmlDocument这个文件在书上是import com.sun.xml.tree.XmlDocument;
    而我找不到这个...用import org.apache.crimson.tree.XmlDocument;这个替代...
    值得注意的是:XmlDocument.class这个文件在很多地方都有,比如在F:\oracle\ora90\oem_webstage\oracle\xml\parser\v2里面也有XmlDocument.class这个文件...它跟org.apache.crimson.tree.XmlDocument这个大小是不一样的
    我认为用"import org.apache.crimson.tree.XmlDocument;"这个替代"import com.sun.xml.tree.XmlDocument;"是不正确的...但我又找不到"import com.sun.xml.tree.XmlDocument;"这个文件.
    大家帮帮忙啊...我两个星期了都无法解决这个问题....谢谢!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/26 22:49:00
     
     binaryluo 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:679
      积分:5543
      门派:IEEE.ORG.CN
      注册:2005/2/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客4
    发贴心情 
    我看你的程序要做的事情就是把intros.xml中的内容解析出来,然后输出到intros2.xml中。
    但是document不是I/O类型的怎么可能用来做输出操作呢?
    如果你要完成的话应该在解析的过程中把解析得到的内容先保存在一个集合类中(也可以是其他容器),然后再用OutputStream之类的I/O操作输出到相应文件中。

    不知道这样说能否对你有所帮助?

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/28 18:50:00
     
     1702king 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:79
      门派:XML.ORG.CN
      注册:2005/4/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给1702king发送一个短消息 把1702king加入好友 查看1702king的个人资料 搜索1702king在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看1702king的博客5
    发贴心情 
    谢谢你!我知道你说的这种方法...
    获得将DOM文档转化为XML文件的转换器,在jdk1.4中,有类TransformerFactory
    // 来实现,类Transformer实现转化API。
                TransformerFactory tfactory = TransformerFactory.newInstance();
                Transformer transformer = tfactory.newTransformer();
    // 将DOM对象转化为DOMSource类对象,该对象表现为转化成别的表达形式的信息容器。
                DOMSource source = new DOMSource(document);
    // 获得一个StreamResult类对象,该对象是DOM文档转化成的其他形式的文档的容器,可以是XML文件,文本文件,HTML文件。这里为一个XML文件。
                StreamResult result = new StreamResult(new File(“intro2.xml”));
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/29 11:16:00
     
     1702king 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:79
      门派:XML.ORG.CN
      注册:2005/4/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给1702king发送一个短消息 把1702king加入好友 查看1702king的个人资料 搜索1702king在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看1702king的博客6
    发贴心情 
    我想com.sun.xml.tree.xmldocument这种write方法是以前旧版本的..
    现在JAXP里面都没有这个com.sun.xml.tree.xmldocument包了...所以不支持
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/29 11:18:00
     
     lili 美女呀,离线,快来找我吧!
      
      
      等级:大一(猛啃高等数学)
      文章:11
      积分:111
      门派:XML.ORG.CN
      注册:2005/3/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lili发送一个短消息 把lili加入好友 查看lili的个人资料 搜索lili在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看lili的博客7
    发贴心情 
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/5/12 17:44:00
     
     sericalee 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2005/11/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给sericalee发送一个短消息 把sericalee加入好友 查看sericalee的个人资料 搜索sericalee在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看sericalee的博客8
    发贴心情 
    怎么处理阿,我也遇到了这样的问题
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/11 10:01:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DOM/SAX/XPath 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/27 9:00:01

    本主题贴数8,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    189.453ms