我有像这样的XML
<OuterTag>
<Name>JAVA
</Name>
<InnerTag>
<Name> PHP
</Name>
</InnerTag>
</OuterTag>
我只想要包含“Java”的值。但是当我解析时它也会带来“PHP”,因为本地名称是相同的。是否可以过滤多个LocalNames并选择我想要的?我怎么能这样做?
答案 0 :(得分:1)
想法是保存你所处的状态,只需使用一个布尔值,如果找到'OuterTag'的开放标记,则将其设置为true,并在找到'InnerTag'的开放标记时将其设置为false
这样,当您找到'name'标签时,您就可以了。
另一种更灵活的方法是在找到标签名称时按下/弹出标签名称。这样,当您找到“名称”标记然后获得正确的值时,您可以检查谁是您的父标记。
答案 1 :(得分:0)
如果我理解正确,您需要Name
下的OuterTag
标记,而不是InnerTag
下的 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);
标记。所以,我就是这样做的dom4j:
{{1}}
我希望这会有所帮助。
答案 2 :(得分:0)
Sax解析器通常具有可以编写代码的钩子,特别是StartElement
,EndElement
和characters
。
莫斯有正确的答案 -
StartElement :将元素名称推送到堆栈。
字符:如果元素名称为'name',并且堆栈上有“OuterTag”元素, 然后你找到了自己的价值。否则,请忽略它。
EndElement 将元素弹出堆栈。
请注意,sax解析器功能非常强大,但有时候会过度杀伤。非常快,适用于解析格式错误的xml或非常大的XML文件,在解析器遇到它们时对元素做出反应。
我会小心地建议'考虑'一个XPath解决方案,它可以为你解析,让你轻松引用任何元素。创建一个Xpath对象并使用类似'/OuterTag/Name[1]'
的内容进行查询。如果您之前使用过jQuery,那么您将会在家中。
但是,如果您的XML格式错误或非常庞大和复杂,这可能会非常缓慢。你被警告过了。
只要知道XPath可用作可能的解决方案。 http://www.javabeat.net/tips/182-how-to-query-xml-using-xpath.html