Java 使用多个DefaultHandler扩展的SAX
我遇到的问题是,我想使用SAX defaultHandler类的扩展解析出1个XML文档。当只使用一个处理程序时,我可以解析XML并为对象的属性分配不同的标记(请参见域和区域)。一旦我在域和区域对象中有了这些,我想将它们添加到另一个对象(GroupedFiles)中,该对象有一个域和区域列表。我遇到的问题是使用2个处理程序解析出1个文档。我的理论,尽管不是最佳的编码实践,是两次解析文档,使用域处理程序运行一次,设置域,然后添加到分组文件,然后对区域执行相同的操作。这是密码Java 使用多个DefaultHandler扩展的SAX,java,xml,xml-parsing,sax,saxparser,Java,Xml,Xml Parsing,Sax,Saxparser,我遇到的问题是,我想使用SAX defaultHandler类的扩展解析出1个XML文档。当只使用一个处理程序时,我可以解析XML并为对象的属性分配不同的标记(请参见域和区域)。一旦我在域和区域对象中有了这些,我想将它们添加到另一个对象(GroupedFiles)中,该对象有一个域和区域列表。我遇到的问题是使用2个处理程序解析出1个文档。我的理论,尽管不是最佳的编码实践,是两次解析文档,使用域处理程序运行一次,设置域,然后添加到分组文件,然后对区域执行相同的操作。这是密码 GroupedFile
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);
GroupedFiles GroupedFiles=新的GroupedFiles();
ArrayList域=新的ArrayList();
ArrayList areas=新的ArrayList();
//从工厂创建解析器
XMLReader parser=XMLReaderFactory.createXMLReader();
//从文件“someFile.xml”创建输入流
InputStream in=newfileinputstream(新文件(“someFile.xml”);
InputSource source=新的InputSource(in);
//创建处理程序实例
DomainHandler DomainHandler=新的DomainHandler();
AreaHandler AreaHandler=新的AreaHandler();
//使用每个处理程序从文档中解析XML,
//将其添加到具有正确属性的对象,然后添加这些属性
//指向另一个具有域、区域和目录列表的对象。
setContentHandler(domainHandler);
parser.parse(源代码);
domains=domainHandler.getXML();
groupedFiles.setDomain(域);
setContentHandler(areaHandler);
parser.parse(源代码);
areas=areaHandler.getXML();
groupedFiles.setArea(区域);
但是我不能,它似乎挂在了第二个
parser.parse(source)
上。如果我在运行后查看groupedFiles,域已填充,但区域未填充。有什么建议吗?您不需要进行多次传递,您可以在解析过程中交换内容处理程序XMLReader
有一个setContentHandler
方法,您可以调用该方法来传入新的处理程序。例如,如果您在startElement
中识别出一个标记,该标记位于另一个处理程序覆盖的区域的开头,或者如果您将元素留在endElement
中,并希望切换回以前的内容处理程序,则可以设置一个新的内容处理程序
例如,请查看或签出。为什么不定义一个处理程序来执行您首先希望它执行的操作?如果每个处理程序(有两个以上,但目前只保留为2个)执行的操作不是那么复杂,我会这么做。他们解析过于复杂的XML(由计算机生成)的方式几乎不可能只使用一个处理程序。我试图避免这种情况,因为它涉及重写我的代码,但我认为这将是最合适的选择。谢谢@Eric:为了让当前的东西正常工作,你可以尝试制作一个新的InputSource,我怀疑在你做的时候重用它是个问题。从长远来看,交换ContentHandler似乎要好得多。