Java 使用SAXParser检查多个标记

Java 使用SAXParser检查多个标记,java,android,xml,parsing,saxparser,Java,Android,Xml,Parsing,Saxparser,我不知道如何正确表达这个问题,但我会举个例子 假设我想知道标记块的属性类型,我可以 if (localName == "block") { int type = Integer.parseInt(attributes.getValue("type)); 然而,我也有不同的文件来描述块类型本身,它使用 标记作为基本标记。我必须知道该属性是否是(级别/块类型)和块的子级。或者如果它在LevelArray和Block下 我希望我讲得有道理,因为我对Xml/xmlparsing知之甚少

我不知道如何正确表达这个问题,但我会举个例子

假设我想知道标记
块的属性
类型
,我可以

 if (localName == "block") {

    int type = Integer.parseInt(attributes.getValue("type));
然而,我也有不同的文件来描述块类型本身,它使用 标记作为基本标记。我必须知道该属性是否是(级别/块类型)和块的子级。或者如果它在LevelArray和Block下

我希望我讲得有道理,因为我对Xml/xmlparsing知之甚少


-如何从嵌套在其他元素中的元素中查找属性?

您必须跟踪状态。例如,您可以有一个名为
inBlockTag
的实例变量,该变量最初为false。在
startElement
方法中,如果
localName.equals(“block”)
则可以将
inBlockTag
设置为true。然后,在处理其他元素时,可以检查该标志的值,以了解您是否在块的子元素中。如果您这样做,请不要忘记在endElement方法中将其设置回false(同样,当
localName.equals(“block”)

如果我理解正确,那么您的问题似乎是如何处理
type
属性实际上取决于实际节点的结构;换句话说,处理
type
属性的方式取决于
block
元素是否具有父级“LevelArray”,或者
block
本身是否是文档根元素

在这种情况下,我认为您需要围绕SAX回调实现自己的简单状态机。换句话说,在SAX解析器遍历XML文件时,有一些变量跟踪哪些元素已经打开和关闭。这将是一件非常简单的事情

另一种选择是使用DOM解析器,因为DOM解析器使您能够获取给定元素的子元素列表等。但是,除非您的需求非常复杂,否则我将坚持使用SAX解析器,并按照建议实现一个状态机。相比之下,DOM解析器是重量级的,使用起来更复杂