Java XML SAX解析中如何忽略相似标记

Java XML SAX解析中如何忽略相似标记,java,android,saxparser,Java,Android,Saxparser,我有这样的XML <OuterTag> <Name>JAVA </Name> <InnerTag> <Name> PHP </Name> </InnerTag> </OuterTag> JAVA PHP 我只想要那个包含“Java”的值。但是当我解析时,它也会带来“PHP”,因为本地名称是相同的。是否可以筛选多个本地名称并选择我想要的一个?我该怎么做

我有这样的XML

<OuterTag>
       <Name>JAVA
      </Name>
<InnerTag>
     <Name> PHP
    </Name>
</InnerTag>

</OuterTag>

JAVA
PHP

我只想要那个包含“Java”的值。但是当我解析时,它也会带来“PHP”,因为本地名称是相同的。是否可以筛选多个本地名称并选择我想要的一个?我该怎么做?

这个想法是保存您所处的状态,只要使用一个布尔值,如果您找到“OuterTag”的打开标记,则将其设置为true;如果您找到“InnerTag”的打开标记,则将其设置为false

这样,当您找到“name”标签时,您就可以知道您现在所在的位置


另一种更灵活的方法是在找到标记名时按下/弹出标记名。这样,当您找到“name”标记时,您可以检查谁是您的父标记,然后获得正确的值。

如果我理解正确,您希望在
OuterTag
下使用
name
标记,而不是
InnerTag
下的标记。所以,我会这样做:


我希望这能有所帮助。

Sax解析器通常有钩子,可以在钩子中编写代码,特别是
StartElement
EndElement
字符

莫斯有正确的答案-

StartElement:将元素名称推送到堆栈上

字符:如果元素名为“name”,并且堆栈上有一个“OuterTag”元素, 然后你发现了你的价值。否则,忽略它

EndElement将元素从堆栈中弹出


请注意,sax解析器非常强大,但有时功能过于强大。非常快,非常适合解析格式错误的xml或非常大的xml文件,在解析器遇到元素时对其作出反应

我会仔细地建议“考虑”一个XPath解决方案,它为您完成解析工作,允许您轻松地引用任何元素。创建一个Xpath对象,并使用类似于
'/OuterTag/Name[1]'
的内容对其进行查询。如果您以前使用过jQuery,您就可以放心了

但是,如果您的XML格式不正确或者非常大和复杂,那么这可能会非常慢。你已经被警告过了


只需知道XPath是一种可能的解决方案

我是SAX解析的初学者,如果你给我一个带有合适方法的代码示例,那么它会更有用,谢谢。如果你只需要从XML中获取一些任意值,那么XPath对你来说可能是一个更好的选择?我认为SAX解析。您可以指定您最喜欢的SAX解析器,或者“如果未明确指定解析器,则使用org.xml.SAX.driver系统属性的标准SAX策略来确定XMLReader的实现类。如果未定义org.xml.SAX.driver系统属性,则通过反射使用JAXP”
    SAXReader saxReader = new SAXReader();
    saxReader.addHandler("OuterTag/Name", new ElementHandler() {

        @Override
        public void onStart(ElementPath arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onEnd(ElementPath arg0) {
            // TODO Auto-generated method stub

        }
    });

    File inputFile = new File(filename);
    saxReader.read(inputFile);