2011-05-10 82 views
0

林使,其获取使用的SAXParser一些XML的应用程序。 林解析XML,如果XML没有特定的节点我都用不同的URL开始在SAXParser的。停止/断裂SaxXMLparsing

这意味着,当我在里面的startElement我的XML处理程序是我必须打破/停止并再次这样做。我该如何做这个休息/停止/退出?

这里有一些假的代码解释:

private String browsLevel(String url) { 
       SAXParserFactory spf = SAXParserFactory.newInstance(); 
       SAXParser sp = spf.newSAXParser(); 
       XMLReader xr = sp.getXMLReader(); 


       URL sourceUrl = new URL(url); 
       MyXMLHandler myXMLHandler = new MyXMLHandler(); 
       xr.setContentHandler(myXMLHandler); 
       xr.parse(new InputSource(sourceUrl.openStream())); 
} 

//external class in a separate document 
public class MyXMLHandler extends DefaultHandler { 

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
     // Im checking here if a special node exsists and if not I need to break/stop this and go to the Restart point above. 
     //I need to do something like this:          
      if (!localName.equals("mysspecialnode")) { 
       MyXMLHandler.break(); //???? 
       browsLevel("a different url"); 
      } 

回答

0

我还没有看到SAX解析器任何破解方法,因为这是事件驱动,从而绕过它需要一个布尔的成员变量,并使其真正在您的条件满足并写上“回报”的声明,并使用该布尔变量的参考和所有其他事件方法(即的endElement和其他人,如果你想)。然后启动呼叫另一个URL返回。 (编写return语句会更快地绕过所有事件,并且可以发起呼叫)。

private String browsLevel(String url)SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader();

  URL sourceUrl = new URL(url); 
      MyXMLHandler myXMLHandler = new MyXMLHandler(); 
      xr.setContentHandler(myXMLHandler); 
      xr.parse(new InputSource(sourceUrl.openStream())); 

      if(myXMLHandler.isStart == true) 
      { 
        // Now initiate a call here with different URL 

        browsLevel("a different url"); 
      } 

}

  public class MyXMLHandler extends DefaultHandler 
     { 
      boolean isStart = false; 

      @Override 
      public void startElement(String uri, String localName, String qName, Attributes          attributes) throws SAXException 
      { 
       // Now check for boolean flag 
        if(isStart) 
        { 
        return; 
        }         
        if (!localName.equals("mysspecialnode")) 
        { 


        isStart = true; 


        } 
+0

这将导致“不同的URL”被解析,除非文档中的所有开始标签都是“mysspecialnode”。我的方法是最初有'isStart = true',并且有'if(localName.equals(“mysspecialnode”)){isStart = false}'。 – Trevor 2011-05-10 10:46:38

+0

退货声明实际上是我在换货/休息时寻找的。谢谢。 – 2011-05-10 13:00:58

0

首先,即使是在某种程度上可以告诉SAX解析器终止在回调方法早在某种程度上分析,这将是一个坏主意,再次调用browsLevel()从处理程序中。处理程序当然是由SAX解析器调用的。处理程序必须完成它的工作,然后将执行返回到SAX解析器。

另外,我觉得你可能误解的startElement的处理程序的目的()。为每个元素开始标记调用此方法,方法是它们出现在已解析的XML文档中。第一次调用startElement()将用于文档中的第一个元素开始标记。因此,if (!localName.equals("mysspecialnode"))语句中的代码块将执行,如果第一个标签串,或任何后续代码字符串,不是“myspecialnode”。换句话说,仅仅这个if陈述不足以检测一个特定的开始标记字符串是否出现在XML文档的任何地方。

我的建议是,你做的以下任一操作:

1:继续使用SAX解析器,但研究SAX解析器文档多一点,让你了解处理程序的目的和范围内的方法它。处理程序及其startElement()方法将针对文档中存在的每个开始元素进行调用。如果你感兴趣的仅仅包含一个元素<myspecialnode ... >内的数据,那么你可以简单地做:

public class MyXMLHandler extends DefaultHandler { 

@Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 

    if (localName.equals("mysspecialnode")) { 
    // If you are here, then the XML document DOES contain <myspecialnode>. Now that you are here, you can parse the attributes 
    // that are contained in this node. You could also set a flag to indicate that you’re now inside the <myspecialnode> element, 
    // to indicate that subsequent start tags are nodes inside <myspecialnode>, until the point where you get a </myspecialnode> 
    // end tag. 
    // When parsing has finished, you check this flag and if it is false, you call 
    // the SAX parser again to parse "a different url". 
    } 

基本上,SAX解析器,您的应用程序代码通过消耗所有的文档数据该处理程序按照其出现在XML文档中的顺序排列。

2:第二个选项是使用DOM解析器。 Android平台包含SAX和DOM解析器。 SAX的优势在于它不需要事先在内存中建立XML文档的文档对象模型;相反,它会遍历文档并在解析文档时调用处理程序的数据。这样做的缺点是,必须能够在数据交付给处理程序时处理数据,以便数据显示在文档中。使用DOM解析器,您将面临与最初构建XML文档模型相关的CPU和内存损失。但是,一旦完成,您就可以使用标准DOM调用来随机浏览XML文档,通过给定名称获取元素的节点列表等等。我认为一旦你使用SAX就可以实现你想要的东西我们已经理解了处理程序如何工作得更好一些,但是也可能需要做一个Android DOM解析器教程。

+0

谢谢你的回答。我将继续使用Sax解析器。我想我已经解释了一些错误。什么后在检查是否有一个特殊的节点不存在于XML中,然后我需要再次使用不同的URL做出XML请求。 – 2011-05-10 12:50:57

1

抛出异常。 SAXException足够。如果文档很短,则抛出异常的成本可能会大于只允许SAX解析器完成的成本。

或者使用像kxml2这样的pull解析器,而不是使用SAX引擎的文档流而不是SAX引擎。