2011-09-04 13 views
1

我真的需要在试图让我的解析器读别人的帮助,并显示XML文件只是一个部分,我可以得到两个from从上到下阅读,但是当我试图用我的XML处理程序内的标签,每个章节都分离出它不会做它,去精神,并显示它SAX解析器不会阅读和打印我的XML文件的一个部分

一位这是我的解析器

package heavytime 
import java.net.URL; 

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.InputSource; 
import org.xml.sax.XMLReader; 

//import android.content.Intent; 
import android.os.Bundle; 
//import android.view.View; 
//import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class Mainweather extends Seskanoreweatherpart2Activity { 

weatherlist sitesList = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main2); 

    LinearLayout layout = new LinearLayout(this); 
    layout.setOrientation(1); 
    layout.setBackgroundColor(0xFF000080); 

    TextView value []; 

    try { 

     /** Handling XML */ 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 
     XMLReader xr = sp.getXMLReader(); 

     /** Send URL to parse XML Tags */ 
     URL sourceUrl = new URL(
     "http://www.seskanore.com/currentoutput.xml"); 


     /** Create handler to handle XML Tags (extends DefaultHandler) */ 
     XMLhandler XMLhandler = new XMLhandler(); 
     xr.setContentHandler(XMLhandler); 
     xr.parse(new InputSource(sourceUrl.openStream())); 

     } catch (Exception e) { 
     System.out.println("XML Pasing Excpetion = " + e); 
     } 

     /** Get result from XMLhandler SitlesList Object */ 
     sitesList = XMLhandler.sitesList; 

     /** Assign textview array lenght by arraylist size */ 
    //  item = new TextView[sitesList.getName().size()]; 
     value = new TextView[sitesList.getName().size()]; 

     /** Set the result text in textview and add it to layout */ 
     for (int i = 0; i < sitesList.getName().size(); i++) { 
     value[i] = new TextView(this); 
     value[i].setText(sitesList.getvalue().get(i)+ " is "   +sitesList.getitem().get(i)); 

     layout.addView(value[i]); 

     } 


     /** Set the layout view to display */ 
     setContentView(layout); 
} 
} 

此代码是我的XML处理程序的代码

package heavytime 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class XMLhandler extends DefaultHandler { 

Boolean currentElement = false; 
Boolean temperature = false; 
String currentValue = null; 
// int currentVal = 0; 
public static weatherlist sitesList = null; 

public static weatherlist getSitesList() { 
return sitesList; 
} 

public static void setSitesList(weatherlist sitesList) { 
XMLhandler.sitesList = sitesList; 
} 

@Override 
    public void startDocument() throws SAXException { 
     // Some sort of setting up work 
    } 

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

    currentElement = true; 

if (localName.equals("weatherdata")) 
{ 
    sitesList = new weatherlist();} 
else if (localName.equals("item")){ 
     temperature = true; 
     String attr = attributes.getValue("name"); 
     sitesList.setValue(attr);} 


} 



/** Called when tag closing*/ 
@Override 
public void endElement(String uri, String localName, String qName) 
throws SAXException { 

currentElement = false; 

/** set value*/ 
if (localName.equals("temperaturetags")){ 
    localName.equalsIgnoreCase("item"); 
    sitesList.setName(currentValue); 
    localName.equalsIgnoreCase("value"); 
    sitesList.setitem(currentValue); 

} 


temperature = false; 
} 

/** Called to get tag characters*/ 
@Override 
public void characters(char[] ch, int start, int length) 
throws SAXException { 

if (currentElement) { 
currentValue = new String(ch, start, length); 
currentElement = false; 
} 
} 

@Override 
public void endDocument() throws SAXException { 
    // Some sort of finishing up work 
} 
} 

该守则我ArrayList中显示的解析信息

package heavytime 
    import java.util.ArrayList; 


    public class weatherlist { 

private ArrayList<String> value = new ArrayList<String>(); 
private ArrayList<String> name = new ArrayList<String>(); 
private ArrayList<String> item = new ArrayList<String>(); 

/** In Setter method default it will return arraylist 
* change that to add */ 

public ArrayList<String> getvalue() { 
return value; 
} 

public void setValue(String value) { 
this.value.add(value); 
} 

public ArrayList<String> getName() { 
return name; 
} 

public void setName(String name) { 
this.name.add(name); 
} 

public ArrayList<String> getitem() { 
return item; 
} 

public void setitem(String item) { 
this.item.add(item); 
} 

    } 

我希望它的温度标签中仅显示标签,但我用尽一切,似乎没有任何工作 有人可以帮我

非常感谢

+0

你能粘贴XML? –

+0

xml非常长,它在从 – user927760

回答

2

你正在做假设characters方法将只对从解析器startElementendElement通话之间一次打来电话,提供entore CON的常见错误帐篷之间的开始和结束标签。它实际上可以被多次调用,每次调用只包含部分内容。

的适当处理是创建或附加在的startElement方法某种(通常是StringBuilderStringBuffer)的累加器,累加到它中的字符的方法,然后使用和处置,或在的endElement方法分离它。

我认为你的代码有更多的错误,但这可能是它开始工作的开始。

为了只处理特定标签内的项目,您需要设置一个布尔标志,以表明您在startElement方法中发现了该标签,并在标签的endElement中将其设置为false并在收集来自其他标签的数据之前测试该标志。您需要为<item>的每个子标签使用上述过程,因为它们将数据作为字符包含在其中。

为了我自己的乐趣,并希望它能帮助你更好地理解这一切,我写了一个小处理程序,将<temperaturetags>下的数据收集到地图列表中。

package com.donroby; 

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class WeatherHandler extends DefaultHandler { 

    private List<Map<String,String>> result = new ArrayList<Map<String,String>>(); 
    private Map<String,String> currentItem; 
    private boolean collectingItems; 
    private boolean collectingItem; 
    private StringBuilder builder; 

    public List<Map<String,String>> getResult() { 
     return result; 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
     if (qName.equals("temperaturetags")) { 
      collectingItems = true; 
     } 
     else if (qName.equals("item") && collectingItems) { 
      currentItem = new HashMap<String,String>(); 
      currentItem.put("name", attributes.getValue("name")); 
      collectingItem = true; 
     } 
     else if (collectingItem) { 
      builder = new StringBuilder(); 
     } 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) throws SAXException { 
     if (qName.equals("temperaturetags")) { 
      collectingItems = false; 
     } 
     if (qName.equals("item") && collectingItems) { 
      result.add(currentItem); 
      currentItem = null; 
      collectingItem = false; 
     } 
     else if (collectingItem) { 
      currentItem.put(qName, builder.toString()); 
      builder = null; 
     } 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) throws SAXException { 
     if (collectingItem &&(builder != null)) { 
      builder.append(ch, start, length); 
     } 
    } 
} 

对于实际使用,我更可能创建一个域对象,并收集到该类的名单,但是这将臃肿的代码有点出乎我想要一个快速的样品做。

+0

解析的链接中,我可以让解析器从上到下读取并打印出整个xml表,这取决于我在XML处理程序中使用的标记,这就是为什么我认为问题是因为我正在seaching标签,因为内部标签是相同的,唯一不同的标签是中间标签,所以如果我把一个stringeffer在startelement和endelement它只会允许我想要的一段标签被阅读并显示? – user927760

+0

请参阅我的编辑以获取更多帮助。 –

+0

请参阅添加的示例代码。 –

0

characters()函数中,使用String.trim(),然后在继续之前检查是否为String.length()>0

然后用stack模型和push()startElement()pop()数据和endElement()事件分别