Android 使用SAX解析器选择特定的xml标记
我正在为android设计一个应用程序,我需要解析一个XML文件,有人告诉我SAX解析器更适合移动设备,我一直在尝试使用它,但我被卡住了。以下是XML代码:Android 使用SAX解析器选择特定的xml标记,android,xml,parsing,sax,saxparser,Android,Xml,Parsing,Sax,Saxparser,我正在为android设计一个应用程序,我需要解析一个XML文件,有人告诉我SAX解析器更适合移动设备,我一直在尝试使用它,但我被卡住了。以下是XML代码: <current_conditions> <condition data="Clear"/> <temp_f data="50"/> <temp_c data="10"/> <humidity data="Humidity: 76%"/>
<current_conditions>
<condition data="Clear"/>
<temp_f data="50"/>
<temp_c data="10"/>
<humidity data="Humidity: 76%"/>
<icon data="/ig/images/weather/sunny.gif"/>
<wind_condition data="Wind: NE at 14 mph"/>
</current_conditions>
<forecast_conditions>
<day_of_week data="Tue"/> ****
<low data="43"/>
<high data="64"/> ****
<icon data="/ig/images/weather/mostly_sunny.gif"/>
<condition data="Mostly Sunny"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="Wed"/>
<low data="43"/>
<high data="64"/>
<icon data="/ig/images/weather/sunny.gif"/>
<condition data="Clear"/>
</forecast_conditions>
要获得这两个值,您可以执行以下操作:
public class ExampleHandler extends DefaultHandler {
private static final String FORECAST_CONDITION = "forecast_condition";
private boolean day_of_week_dataWanted = false;
private boolean high_dataWanted = false;
private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();
public ParsedExampleDataSet getParsedData() {
return this.myParsedExampleDataSet;
}
public ExampleHandler() {
this.myParsedExampleDataSet = new ParsedExampleDataSet();
}
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if(FORECAST_CONDITION.equals(localName)){
if("day_of_week".equals(localName)){
day_of_week_dataWanted = true;
}
if("high".equals(localName)){
high_dataWanted = true;
}
}
}
@Override
public void characters(char ch[], int start, int length) {
if(day_of_week_dataWanted){
myParsedExampleDataSet.setLowValue(new String(ch, start, length));
day_of_week_dataWanted = false;
}
if(high_dataWanted){
myParsedExampleDataSet.setCurrtempValue(new String(ch, start, length));
high_dataWanted = false;
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
}
}
但是,您可以看到更多优雅的解决方案,希望这能给您一个提示。如果我是您,那么我将使用XML框架为您完成XML解析工作。那么,创建几个对象将这些数据从XML中提取出来就不会太困难了
另外,我对我所有的XML都使用简单项目,所以我甚至写了一篇博客文章解释如何在Android项目中使用它:。我通过在数组中填充值对其进行排序,当我想显示它们时,我只需使用它们在数组中的位置来调用它们。你想知道你的XML元素何时出现并将它们全部保存到你的“ParsedExampleDataSet”这样,如果以后需要,您可以使用它们。也许把它们保存在地图上。上面给出了您所需要的,对吗?不,它没有返回任何值。我需要得到今天的4个值,第二天的2个值。我已经能够获得当天的值。我想立即显示它们。它们已读取。您不应该立即显示它们。XML解析器填充myParsedExampleDataSet对象,然后调用getParsedData(),您可以访问变量。是的,我就是这样做的,但我仍然无法在第二天获取值,因为有一系列同名的标记
public class ExampleHandler extends DefaultHandler {
private static final String FORECAST_CONDITION = "forecast_condition";
private boolean day_of_week_dataWanted = false;
private boolean high_dataWanted = false;
private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();
public ParsedExampleDataSet getParsedData() {
return this.myParsedExampleDataSet;
}
public ExampleHandler() {
this.myParsedExampleDataSet = new ParsedExampleDataSet();
}
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if(FORECAST_CONDITION.equals(localName)){
if("day_of_week".equals(localName)){
day_of_week_dataWanted = true;
}
if("high".equals(localName)){
high_dataWanted = true;
}
}
}
@Override
public void characters(char ch[], int start, int length) {
if(day_of_week_dataWanted){
myParsedExampleDataSet.setLowValue(new String(ch, start, length));
day_of_week_dataWanted = false;
}
if(high_dataWanted){
myParsedExampleDataSet.setCurrtempValue(new String(ch, start, length));
high_dataWanted = false;
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
}
}