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