【问题标题】:SAX Using Multiple DefaultHandler ExtensionsSAX 使用多个 DefaultHandler 扩展
【发布时间】:2013-03-26 14:56:04
【问题描述】:

我遇到的问题是我想使用 SAX defaultHandler 类的扩展解析出 1 个 XML 文档。当只使用一个处理程序时,我可以解析出 XML 并将不同的标签分配给对象的属性(请参阅域和区域)。一旦我在域和区域对象中拥有这些,我想将它们添加到另一个具有域和区域列表的对象(GroupedFiles)中。我遇到的问题是使用 2 个处理程序解析 1 个文档。我的理论,尽管不是最好的编码实践,是解析文档两次,使用域处理程序运行一次,设置域,然后添加到分组文件,然后对区域执行相同操作。这是代码,

GroupedFiles groupedFiles = new GroupedFiles();
ArrayList<Domain> domains = new ArrayList<Domain>();
ArrayList<Area> areas = new ArrayList<Area>();

//Create parser from factory
XMLReader parser = XMLReaderFactory.createXMLReader();

//Creates an input stream from the file "someFile.xml"
InputStream in = new FileInputStream(new File("someFile.xml"));
InputSource source = new InputSource(in);

//Create handler instances
DomainHandler domainHandler = new DomainHandler();
AreaHandler areaHandler = new AreaHandler();

//Parses out XML from a document using each handler, 
//adding it to an object with the correct properties then adds those
//to another object which features Lists of Domains, Areas, and Directories.
parser.setContentHandler(domainHandler);
parser.parse(source);
domains = domainHandler.getXML();
groupedFiles.setDomain(domains);

parser.setContentHandler(areaHandler);
parser.parse(source);
areas = areaHandler.getXML();
groupedFiles.setArea(areas);

但是我做不到,它似乎挂断了第二个parser.parse(source)。如果我在运行后查看 groupedFiles 域已填充但区域未填充。有什么建议吗?

【问题讨论】:

  • 为什么不首先定义一个处理程序来执行您希望它执行的操作?
  • 如果每个处理程序(超过 2 个,但目前只保留 2 个)所做的事情不那么复杂,我会这样做。他们解析过于复杂的 XML(由计算机生成)的方式使得只使用一个处理程序几乎是不可能的。

标签: java xml xml-parsing sax saxparser


【解决方案1】:

您不需要进行多次传递,您可以在解析过程中交换内容处理程序。 XMLReader 有一个 setContentHandler 方法,你可以调用它来传入一个新的处理程序。例如,如果您在startElement 中识别出一个开始由不同处理程序覆盖的区域的标签,或者如果您将元素留在endElement 中并想要切换回以前的内容,则可以设置一个新的内容处理程序处理程序。

有关示例,请参阅此JavaWorld article 或查看this answer

【讨论】:

  • 我试图避免这种情况,因为它涉及重写我的代码,但我认为这将是最合适的选择。谢谢!
  • @Eric:为了让当前的东西正常工作,你可以尝试制作一个新的 InputSource,我怀疑在你做的时候重用它是问题所在。从长远来看,交换内容处理程序似乎要好得多。
猜你喜欢
  • 2016-10-12
  • 2011-09-03
  • 2016-07-12
  • 2015-09-29
  • 1970-01-01
  • 2012-07-11
  • 2011-03-15
  • 2014-07-03
  • 1970-01-01
相关资源
最近更新 更多