我真的需要有人帮助尝试让我的解析器读取并只显示xml文件的一部分,我可以从上到下读取两个但是当我尝试使用我的xml处理程序中的内部标记时每个部分都没有做到这一点,并且精神上显示了一点
这是我的Parser的代码
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 :(得分:2)
您犯了一个常见的错误,即假设characters
方法只会在来自解析器的一对startElement
和endElement
调用之间调用一次,并提供两者之间的重要内容开始和结束标记。它实际上可以多次调用,每个调用只包含部分内容。
正确的处理是在startElement方法中创建或附加某种累加器(通常是StringBuilder
或StringBuffer
),在characters方法中累积到它,然后使用和处理或者在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);
}
}
}
对于实际使用,我更有可能创建一个域对象并收集到该类的列表中,但这会使代码膨胀超出我想要的快速样本。
答案 1 :(得分:0)
在characters()
功能中,使用String.trim()
,然后在继续之前检查String.length()>0
是否正确。
然后分别在stack
和push()
事件中使用pop()
模型以及startElement()
和endElement()
数据