CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  Web Services / XML

100分,继续问.用SaxParser解析XML时如何获得被解析XML文档的DOCTYPE ?

楼主shikn(shikn)2004-09-03 08:33:32 在 Java / Web Services / XML 提问

rt  
  比如  
  <?xml   version="1.0"?>  
  <!DOCTYPE   XmlEmployees   SYSTEM   "./DTD/Employees.dtd">  
          <XmlEmployee>  
              ..........  
   
  用sax解析这个文档,如何获得"./DTD/Employees.dtd"这个字符串?      
   
  有没有这个事件的处理函数?  
  问题点数:0、回复次数:4Top

1 楼usabcd(9号公路上的3名共军)回复于 2004-09-03 15:29:53 得分 0

这个有一点麻烦哦。  
  你写的自己的handler   除了要implements   ContentHandler外还要implements   LexicalHandler  
   
  handler中实现startDTD()方法  
  System.out.println(systemId);   //这个systemId就时你要的东西  
  在解析时:  
  xmlReader.setContentHandler(handler);  
  xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler",   handler);  
  xmlReader.parse("test.xml");  
  Top

2 楼XIHSHI(西红柿)回复于 2004-09-04 15:58:00 得分 0

去找个好的例子看看Top

3 楼DaveX(秋水长滩)回复于 2004-10-12 18:07:53 得分 0

同意2楼的。  
  摘录自sun的一个例子,应该对你有帮助  
  import   java.io.*;  
  import   org.xml.sax.*;  
  import   org.xml.sax.helpers.DefaultHandler;  
  import   org.xml.sax.ext.LexicalHandler;  
  import   javax.xml.parsers.SAXParserFactory;  
  import   javax.xml.parsers.ParserConfigurationException;  
  import   javax.xml.parsers.SAXParser;  
   
   
  public   class   Echo12   extends   DefaultHandler   implements   LexicalHandler   {  
          static   private   Writer   out;  
          StringBuffer   textBuffer;  
          private   String   indentString   =   "         ";   //   Amount   to   indent  
          private   int   indentLevel   =   0;  
   
          public   static   void   main(String[]   argv)   {  
                  if   (argv.length   !=   1)   {  
                          System.err.println("Usage:   cmd   filename");  
                          System.exit(1);  
                  }  
   
                  //   Use   an   instance   of   ourselves   as   the   SAX   event   handler  
                  Echo12   handler   =   new   Echo12();  
   
                  //   Use   the   validating   parser  
                  SAXParserFactory   factory   =   SAXParserFactory.newInstance();  
                  factory.setValidating(true);  
   
                  //factory.setNamespaceAware(true);  
                  try   {  
                          //   Set   up   output   stream  
                          out   =   new   OutputStreamWriter(System.out,   "UTF8");  
   
                          //   Parse   the   input  
                          SAXParser   saxParser   =   factory.newSAXParser();  
                          XMLReader   xmlReader   =   saxParser.getXMLReader();  
                          xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler",  
                                  handler);  
                          saxParser.parse(new   File(argv[0]),   handler);  
                  }   catch   (SAXParseException   spe)   {  
                          //   Error   generated   by   the   parser  
                          System.out.println("\n**   Parsing   error"   +   ",   line   "   +  
                                  spe.getLineNumber()   +   ",   uri   "   +   spe.getSystemId());  
                          System.out.println("       "   +   spe.getMessage());  
   
                          //   Use   the   contained   exception,   if   any  
                          Exception   x   =   spe;  
   
                          if   (spe.getException()   !=   null)   {  
                                  x   =   spe.getException();  
                          }  
   
                          x.printStackTrace();  
                  }   catch   (SAXException   sxe)   {  
                          //   Error   generated   by   this   application  
                          //   (or   a   parser-initialization   error)  
                          Exception   x   =   sxe;  
   
                          if   (sxe.getException()   !=   null)   {  
                                  x   =   sxe.getException();  
                          }  
   
                          x.printStackTrace();  
                  }   catch   (ParserConfigurationException   pce)   {  
                          //   Parser   with   specified   options   can't   be   built  
                          pce.printStackTrace();  
                  }   catch   (IOException   ioe)   {  
                          //   I/O   error  
                          ioe.printStackTrace();  
                  }   catch   (Throwable   t)   {  
                          t.printStackTrace();  
                  }  
   
                  System.exit(0);  
          }  
   
          //===========================================================  
          //   SAX   DocumentHandler   methods  
          //===========================================================  
          public   void   setDocumentLocator(Locator   l)   {  
                  //   Save   this   to   resolve   relative   URIs   or   to   give   diagnostics.  
                  try   {  
                          out.write("LOCATOR");  
                          out.write("\n   SYS   ID:   "   +   l.getSystemId());  
                          out.flush();  
                  }   catch   (IOException   e)   {  
                          //   Ignore   errors  
                  }  
          }  
   
          public   void   startDocument()   throws   SAXException   {  
                  nl();  
                  nl();  
                  emit("START   DOCUMENT");  
                  nl();  
                  emit("<?xml   version='1.0'   encoding='UTF-8'?>");  
          }  
   
          public   void   endDocument()   throws   SAXException   {  
                  nl();  
                  emit("END   DOCUMENT");  
   
                  try   {  
                          nl();  
                          out.flush();  
                  }   catch   (IOException   e)   {  
                          throw   new   SAXException("I/O   error",   e);  
                  }  
          }  
  ...   to   be   continuedTop

4 楼DaveX(秋水长滩)回复于 2004-10-12 18:08:53 得分 0

 
          public   void   startElement(String   namespaceURI,   String   sName,   //   simple   name  
                  String   qName,   //   qualified   name  
                  Attributes   attrs)   throws   SAXException   {  
                  echoText();  
                  indentLevel++;  
                  nl();  
                  emit("ELEMENT:   ");  
   
                  String   eName   =   sName;   //   element   name  
   
                  if   ("".equals(eName))   {  
                          eName   =   qName;   //   not   namespaceAware  
                  }  
   
                  emit("<"   +   eName);  
   
                  if   (attrs   !=   null)   {  
                          for   (int   i   =   0;   i   <   attrs.getLength();   i++)   {  
                                  String   aName   =   attrs.getLocalName(i);   //   Attr   name    
   
                                  if   ("".equals(aName))   {  
                                          aName   =   attrs.getQName(i);  
                                  }  
   
                                  nl();  
                                  emit("       ATTR:   ");  
                                  emit(aName);  
                                  emit("\t\"");  
                                  emit(attrs.getValue(i));  
                                  emit("\"");  
                          }  
                  }  
   
                  if   (attrs.getLength()   >   0)   {  
                          nl();  
                  }  
   
                  emit(">");  
          }  
   
          public   void   endElement(String   namespaceURI,   String   sName,   //   simple   name  
                  String   qName   //   qualified   name  
          )   throws   SAXException   {  
                  echoText();  
                  nl();  
                  emit("END_ELM:   ");  
   
                  String   eName   =   sName;   //   element   name  
   
                  if   ("".equals(eName))   {  
                          eName   =   qName;   //   not   namespaceAware  
                  }  
   
                  emit("</"   +   eName   +   ">");  
                  indentLevel--;  
          }  
   
          public   void   characters(char[]   buf,   int   offset,   int   len)  
                  throws   SAXException   {  
                  String   s   =   new   String(buf,   offset,   len);  
   
                  if   (textBuffer   ==   null)   {  
                          textBuffer   =   new   StringBuffer(s);  
                  }   else   {  
                          textBuffer.append(s);  
                  }  
          }  
   
          public   void   ignorableWhitespace(char[]   buf,   int   offset,   int   len)  
                  throws   SAXException   {  
                  //   Ignore   it  
          }  
   
          public   void   processingInstruction(String   target,   String   data)  
                  throws   SAXException   {  
                  nl();  
                  emit("PROCESS:   ");  
                  emit("<?"   +   target   +   "   "   +   data   +   "?>");  
          }  
   
          //===========================================================  
          //   SAX   ErrorHandler   methods  
          //===========================================================  
          //   treat   validation   errors   as   fatal  
          public   void   error(SAXParseException   e)   throws   SAXParseException   {  
                  throw   e;  
          }  
   
          //   dump   warnings   too  
          public   void   warning(SAXParseException   err)   throws   SAXParseException   {  
                  System.out.println("**   Warning"   +   ",   line   "   +   err.getLineNumber()   +  
                          ",   uri   "   +   err.getSystemId());  
                  System.out.println("       "   +   err.getMessage());  
          }  
   
          //===========================================================  
          //   LexicalEventListener   methods  
          //===========================================================  
          public   void   comment(char[]   ch,   int   start,   int   length)  
                  throws   SAXException   {  
          }  
   
          public   void   startCDATA()   throws   SAXException   {  
                  echoText();   //   echo   anything   we've   seen   before   now  
                  nl();  
                  emit("START   CDATA   SECTION");  
          }  
   
          public   void   endCDATA()   throws   SAXException   {  
                  echoText();   //   echo   the   CDATA   text  
                  nl();  
                  emit("END   CDATA   SECTION");  
          }  
   
          public   void   startEntity(java.lang.String   name)   throws   SAXException   {  
                  echoText();   //   echo   anything   we've   seen   before   now  
                  nl();  
                  emit("START   ENTITY:   "   +   name);  
          }  
   
          public   void   endEntity(java.lang.String   name)   throws   SAXException   {  
                  echoText();   //   echo   the   ENTITY   text  
                  nl();  
                  emit("END   ENTITY:   "   +   name);  
          }  
   
          public   void   startDTD(String   name,   String   publicId,   String   systemId)  
                  throws   SAXException   {  
                  nl();  
                  emit("START   DTD:   "   +   name   +   "\n                       publicId="   +   publicId   +  
                          "\n                       systemId="   +   systemId);  
          }  
   
          public   void   endDTD()   throws   SAXException   {  
                  nl();  
                  emit("END   DTD");  
          }  
   
          //===========================================================  
          //   Utility   Methods   ...  
          //===========================================================  
          //   Display   text   accumulated   in   the   character   buffer  
          private   void   echoText()   throws   SAXException   {  
                  if   (textBuffer   ==   null)   {  
                          return;  
                  }  
   
                  nl();  
                  emit("CHARS:       ");  
   
                  String   s   =   ""   +   textBuffer;  
   
                  if   (!s.trim()  
                                      .equals(""))   {  
                          emit(s);  
                  }  
   
                  textBuffer   =   null;  
          }  
   
          //   Wrap   I/O   exceptions   in   SAX   exceptions,   to  
          //   suit   handler   signature   requirements  
          private   void   emit(String   s)   throws   SAXException   {  
                  try   {  
                          out.write(s);  
                          out.flush();  
                  }   catch   (IOException   e)   {  
                          throw   new   SAXException("I/O   error",   e);  
                  }  
          }  
   
          //   Start   a   new   line  
          //   and   indent   the   next   line   appropriately  
          private   void   nl()   throws   SAXException   {  
                  String   lineEnd   =   System.getProperty("line.separator");  
   
                  try   {  
                          out.write(lineEnd);  
   
                          for   (int   i   =   0;   i   <   indentLevel;   i++)  
                                  out.write(indentString);  
                  }   catch   (IOException   e)   {  
                          throw   new   SAXException("I/O   error",   e);  
                  }  
          }  
  }  
  Top

相关问题

  • 有谁有SAXParser XML方面的文档,请发给我一些。
  • 关于XML文档操作
  • 请教:生成xml文档
  • 如何分析XML文档,以及将XML文档本地化?
  • 谁有xml文档对象模型成员的说明文档??
  • 在用MSXML和C++存XML文档时,文档头的处理
  • 请问用pb如何将xml文档转换为txt文档?
  • XML Schema文档之间如何链接?
  • 如何对XML文档进行查询?
  • 求例子,用JDOM处理XML文档

关键词

  • xml
  • 解析
  • saxexception
  • saxparseexception
  • indentlevel
  • textbuffer
  • emit
  • sax
  • ename
  • nl

得分解答快速导航

  • 帖主:shikn

相关链接

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

广告也精彩

反馈

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