使用sax解析器java从特定重复标记获取值的XML
我正在尝试使用sax解析器在xml中获取一些信息 这是:使用sax解析器java从特定重复标记获取值的XML,java,xml,xml-parsing,desktop-application,Java,Xml,Xml Parsing,Desktop Application,我正在尝试使用sax解析器在xml中获取一些信息 这是: <IDENT>show</IDENT> <FORMAL_PARAM_LIST> FORMAL_PARAM_LIST </FORMAL_PARAM_LIST> <BLOCK_SCOPE> BLOCK_SCOPE <VAR_DECLARATION>
<IDENT>show</IDENT>
<FORMAL_PARAM_LIST>
FORMAL_PARAM_LIST
</FORMAL_PARAM_LIST>
<BLOCK_SCOPE>
BLOCK_SCOPE
<VAR_DECLARATION>
VAR_DECLARATION
<LOCAL_MODIFIER_LIST>
LOCAL_MODIFIER_LIST
</LOCAL_MODIFIER_LIST>
<TYPE>
TYPE
<QUALIFIED_TYPE_IDENT>
QUALIFIED_TYPE_IDENT
<IDENT>MenuUI</IDENT>
</QUALIFIED_TYPE_IDENT>
</TYPE>
<VAR_DECLARATOR_LIST>
VAR_DECLARATOR_LIST
<VAR_DECLARATOR>
VAR_DECLARATOR
<IDENT>menu</IDENT>
<EXPR>
EXPR
<CLASS_CONSTRUCTOR_CALL>
STATIC_ARRAY_CREATOR
<QUALIFIED_TYPE_IDENT>
QUALIFIED_TYPE_IDENT
<IDENT>MenuUI</IDENT>
</QUALIFIED_TYPE_IDENT>
<ARGUMENT_LIST>
ARGUMENT_LIST
</ARGUMENT_LIST>
</CLASS_CONSTRUCTOR_CALL>
</EXPR>
</VAR_DECLARATOR>
</VAR_DECLARATOR_LIST>
</VAR_DECLARATION>
<EXPR>
EXPR
<METHOD_CALL>
METHOD_CALL
<DOT>.<IDENT>menu</IDENT><IDENT>showJASPform</IDENT></DOT>
<ARGUMENT_LIST>
ARGUMENT_LIST
</ARGUMENT_LIST>
</METHOD_CALL>
</EXPR>
</BLOCK_SCOPE>
show
正式参数列表
块镜
VAR_声明
本地修改器列表
类型
合格类型标识
梅努伊
变量声明器列表
变量声明器
菜单
EXPR
静态数组创建器
合格类型标识
梅努伊
参数列表
EXPR
方法调用
.menushowJASPform
参数列表
基本上,我想获取ident标记(),在xml中有4个ident,但问题是我不想全部获取,我只想获取第一个ident(show ident),我已经在尝试通过实现布尔值来标记我们在xml元素中的位置来解决它,但是我搞不清楚如何才能在第一个ident处停止
非常感谢您的关注使用从
org.xml.sax.helpers.DefaultHandler
派生的类。在startElement()
方法中找到所需元素后,立即抛出SAXException
。这将立即停止SAX解析器
下面是提供的示例-使用从
org.xml.sax.helpers.DefaultHandler
派生的类。在startElement()
方法中找到所需元素后,立即抛出SAXException
。这将立即停止SAX解析器
这里提供了一个示例-很抱歉发布得太晚,对于那些想弄明白这一点的人来说,除了使用dmitry trifonov先生的方法外,你们还可以在sax中使用Stack方法,你们可以在这里找到sax的Stack方法文章:
希望有帮助 很抱歉发布得太晚,对于那些想弄明白这一点的人来说,除了使用dmitry trifonov先生的方法外,你们还可以在sax中使用Stack方法,你们可以在这里找到sax的Stack方法文章:
希望有帮助 正如您已经提到的,您正在使用一个标志,在if循环中进行如下检查:
if(identag.equalsIgnoreCase(“Ident”)&&Boolean.FALSE.equals(yourfagname)){…}
。最初将您的标志设置为false,在第一次遇到Ident标记后,将其设置为true,这样下次不会考虑Ident标记。感谢您响应我的询问线程,我已经尝试了我的方法,它是if(qName.equalsIgnoreCase(“Ident”)){identFlag=true;}
(在start元素中)然后if(qName.equalsIgnoreCase(“IDENT”){identFlag=false;}
(在endelement中)输出是4个标识,我需要更多的标志来明确第一个标识,还是我的方法有问题?非常感谢您的时间,我想您错过了我在if循环中提到的&&条件,请仔细观察。基本的想法是在解析第一次出现的后将标志设置为true,这样可以n下次出现时,该标志将拒绝其访问循环内部。我希望这会有所帮助,谢谢:)@robot\u alien不幸的是,您的解决方案不会阻止SAX解析器解析文件的其余部分。一旦满足筛选目标,就停止解析非常重要,特别是在您对大文件进行分页时。您是否对基于xpath的文件感兴趣解决方案?正如您已经提到的,您正在使用一个标志,在if循环中进行如下检查:if(identag.equalsIgnoreCase(“Ident”)&&Boolean.FALSE.equals(yourfagname)){…}
。首先将您的标志设置为false,在第一次遇到Ident tag后,将其设置为true,这样下次不会考虑Ident tag。感谢您响应我的询问线程,我已经尝试了我的方法,它是if(qName.equalsIgnoreCase(“Ident”)){identFlag=true;}
(在start元素中)然后if(qName.equalsIgnoreCase(“IDENT”){identFlag=false;}
(在endelement中)输出是4个标识,我需要更多的标志来明确第一个标识,还是我的方法有问题?非常感谢您的时间,我想您错过了我在if循环中提到的&&条件,请仔细观察。基本的想法是在解析第一次出现的后将标志设置为true,这样可以n下次出现时,该标志将拒绝其访问循环内部。我希望这会有所帮助,谢谢:)@robot\u alien不幸的是,您的解决方案不会阻止SAX解析器解析文件的其余部分。一旦满足筛选目标,就停止解析非常重要,特别是在您对大文件进行分页时。您是否对基于xpath的文件感兴趣解决方案?非常感谢您的回复,如果我使用这个aproach(throwin-saxException),这意味着我无法正确获取xml中的更多信息?如果我必须使用其他标记(例如type标记)我需要创建另一个saxparser吗?您可以创建上下文对象,它将处理解析事件并决定是否满足解析终止的条件。哇,这消除了我的困惑!非常感谢您清除了这个问题!非常感谢您的回复,如果我使用t