以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  一个值得探讨的DOM问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=17546)


--  作者:1702king
--  发布时间:4/26/2005 9:33:00 PM

--  一个值得探讨的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();

请问该怎样解决呢?


--  作者:1702king
--  发布时间:4/26/2005 9:37:00 PM

--  
注释的程序:
// 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();    
   }
}


--  作者:1702king
--  发布时间:4/26/2005 10:49:00 PM

--  
简单一点的另外一个程序:(也是同样的错误...编译能通过...运行时出错)
运行: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;"这个文件.
大家帮帮忙啊...我两个星期了都无法解决这个问题....谢谢!


--  作者:binaryluo
--  发布时间:4/28/2005 6:50:00 PM

--  
我看你的程序要做的事情就是把intros.xml中的内容解析出来,然后输出到intros2.xml中。
但是document不是I/O类型的怎么可能用来做输出操作呢?
如果你要完成的话应该在解析的过程中把解析得到的内容先保存在一个集合类中(也可以是其他容器),然后再用OutputStream之类的I/O操作输出到相应文件中。

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


--  作者:1702king
--  发布时间:4/29/2005 11:16:00 AM

--  
谢谢你!我知道你说的这种方法...
获得将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”));

--  作者:1702king
--  发布时间:4/29/2005 11:18:00 AM

--  
我想com.sun.xml.tree.xmldocument这种write方法是以前旧版本的..
现在JAXP里面都没有这个com.sun.xml.tree.xmldocument包了...所以不支持
--  作者:lili
--  发布时间:5/12/2005 5:44:00 PM

--  

--  作者:sericalee
--  发布时间:11/11/2005 10:01:00 AM

--  
怎么处理阿,我也遇到了这样的问题
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
78.125ms