我正在设计一个Android应用程序,我需要解析一个XML文件,我被告知SAX解析器更适合移动设备,我一直在尝试使用它,但我已经卡住了。这是XML代码:
<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>
我试图仅在侧面使用 * 获取两个标记的值,但它会返回文档末尾的值。我如何解决这个问题,因为我只想要XML中的某些值。这是我的代码:
public class ExampleHandler extends DefaultHandler {
private boolean in_in_current_conditions = false;
private boolean in_in_forecast_conditions = false;
private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet();
public ParsedExampleDataSet getParsedData() {
return this.myParsedExampleDataSet;
}
@Override
public void startDocument() throws SAXException {
this.myParsedExampleDataSet = new ParsedExampleDataSet();
}
@Override
public void endDocument() throws SAXException {
}
@Override
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException
{
if (localName.equals("forecast_information"))
{
this.in_forecast_information = true;
}
else if (localName.equals("current_conditions"))
{
this.in_in_current_conditions = true;
}
else if (localName.equals("forecast_conditions"))
{
this.in_in_forecast_conditions = true;
}
else if (localName.equals("high")) {
if (this.in_in_forecast_conditions)
{
String attrValue = atts.getValue("data");
myParsedExampleDataSet.setCurrtempValue(attrValue);
}
} else if (localName.equals("day_of_week")) {
if (this.in_in_forecast_conditions) {
String attrValue1 = atts.getValue("data");
myParsedExampleDataSet.setLowValue(attrValue1);
}
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
if (localName.equals("forecast_information")) {
this.in_forecast_information = false;
} else if (localName.equals("current_conditions")) {
this.in_in_current_conditions = false;
} else if (localName.equals("forecast_conditions")) {
this.in_in_forecast_conditions = false;
}
}
@Override
public void characters(char ch[], int start, int length) {
}
}
答案 0 :(得分:1)
如果我是你,那么我将使用Simple XML框架为您完成XML解析工作。只需创建一些可以从XML中取出这些数据的对象就不会太困难了。
P.S。我将Simple项目用于我的所有XML,所以我甚至写了一篇博客文章,解释如何在Android项目中使用它:you can read it here。
答案 1 :(得分:0)
要获得这两个值,您可以执行以下操作:
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 {
}
}
但是你可以看到更多优雅的解决方案,希望这会给你一个提示。
答案 2 :(得分:0)
我已经通过使用填充数组中的值来对其进行排序,当我想显示它们时,我简单地使用它们在数组中的位置来调用它们