Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用多个DefaultHandler扩展的SAX_Java_Xml_Xml Parsing_Sax_Saxparser - Fatal编程技术网

Java 使用多个DefaultHandler扩展的SAX

Java 使用多个DefaultHandler扩展的SAX,java,xml,xml-parsing,sax,saxparser,Java,Xml,Xml Parsing,Sax,Saxparser,我遇到的问题是,我想使用SAX defaultHandler类的扩展解析出1个XML文档。当只使用一个处理程序时,我可以解析XML并为对象的属性分配不同的标记(请参见域和区域)。一旦我在域和区域对象中有了这些,我想将它们添加到另一个对象(GroupedFiles)中,该对象有一个域和区域列表。我遇到的问题是使用2个处理程序解析出1个文档。我的理论,尽管不是最佳的编码实践,是两次解析文档,使用域处理程序运行一次,设置域,然后添加到分组文件,然后对区域执行相同的操作。这是密码 GroupedFile

我遇到的问题是,我想使用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);
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似乎要好得多。