如何忽略XML SAX解析

问题描述:

类似的标签我有这样的XML一个如何忽略XML SAX解析

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

</OuterTag> 

我只是想它包含的“Java”这个值。但是,当我解析它也带来“PHP”,因为本地名称是相同的。是否可以过滤多个LocalNames并选择我想要的?我怎样才能做到这一点?

+0

如果您只需要从该XML中获取一些任意值,那么XPath会是您更好的选择? – machinery 2012-02-24 16:23:37

想法是保存你所在的状态,只需使用布尔值并将其设置为true,如果你找到'OuterTag'的开放标签并且在你找到'InnerTag的开放标签时将其设置为false ”。

当你发现你的“名称”标签,现在,你是这个样子。

另一种更灵活的方式是推动/当你发现他们流行的标记名称。通过这种方式,您可以在找到“名称”标签时检查谁是您的父标签,然后获取正确的值。

+0

我是SAX解析的起始者,如果你给我一个合适的方法代码的例子,那么它会更有帮助,谢谢 – 2012-02-24 16:03:09

+0

我已经实现了你的逻辑,它的工作原理:) – 2012-02-24 16:40:36

+0

^^不错,它帮助:D – Moss 2012-02-24 18:33:08

如果我忽略correclty,您希望Name标记在OuterTag下,而不是InnerTag下的标记。所以,这是我如何与dom4j做到这一点:

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); 

我希望这有助于。

+0

你是对的,但我是SAX PARSING在这里:) – 2012-02-24 16:16:00

+0

我认为[SAXReader](http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/org/dom4j/io/SAXReader.html)做SAX解析。您可以指定您最喜欢的SAX解析器或“如果未明确指定解析器,则使用org.xml.sax.driver系统属性的标准SAX策略来确定XMLReader的实现类。如果org.xml.sax .driver系统属性未定义,则JAXP通过反射使用“ – MarcoS 2012-02-24 16:28:09

萨克斯语解析器通常有钩子,您可以在其中编写代码,特别是StartElement,EndElementcharacters

莫斯有正确的答案 -

起始元素:按元素名称到堆栈。

characters如果元素名称是'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