编程语言
首页 > 编程语言> > java – SAX使用多个DefaultHandler扩展

java – SAX使用多个DefaultHandler扩展

作者:互联网

我遇到的问题是我想使用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(源).如果我在运行域后查看groupsFiles,则填充域,但区域不是.有什么建议?

解决方法:

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

例如,请参阅此JavaWorld article或查看this answer.

标签:sax,java,xml,xml-parsing,saxparser
来源: https://codeday.me/bug/20190901/1780351.html