Страница 1 из 1
Помогите распарсить XML
Добавлено: 31 май 2012, 16:00
shtlck
Есть xml вида
Код: Выделить всё
<weeks>
<week number="1">
<day number="1">
<jog time="60"></jog>
<walk time="90"></walk>
<repeats qty="8"></repeats>
<total time="20"></total>
</day>
<day number="2">
<jog time="60"></jog>
<walk time="90"></walk>
<repeats qty="8"></repeats>
<total time="20"></total>
</day>
<day number="3">
<jog time="60"></jog>
<walk time="90"></walk>
<repeats qty="8"></repeats>
<total time="20"></total>
</day>
</week>
<week number="2"></week>
<week number="3"></week>
...
</weeks>
Юзер выбирает день и неделю, данные о выбранном записываются в 2 переменных, нужно выцепить конкретную неделю и конкретный день из XML файла, получить значения time и qty от соответствующих тегов и дальше с ними работать. Как можно это сделать? Во всех статьях по работе с хмл предлагают сделать цикл, который будет парсить весь файл и забивать его например в ArrayList. Но мне такое не подходит.
Re: Помогите распарсить XML
Добавлено: 01 июн 2012, 09:49
damager82
1) Можно юзать XmlPullParser, как я описывал в уроке 79.
Переменные:
Код: Выделить всё
boolean thisWeek = false;
boolean thisDay = false;
String tmp = "";
String week = "2";
String day = "2";
Кусок обработки начала тега (START_TAG):
Код: Выделить всё
case XmlPullParser.START_TAG:
if (xpp.getName().equalsIgnoreCase("week")) {
if (xpp.getAttributeValue(0).equalsIgnoreCase(week)) {
thisWeek = true;
} else
thisWeek = false;
break;
}
;
if (thisWeek && xpp.getName().equalsIgnoreCase("day")) {
if (xpp.getAttributeValue(0).equalsIgnoreCase(day)) {
thisDay = true;
} else
thisDay = false;
break;
}
if (thisDay && thisWeek) {
tmp = "";
for (int i = 0; i < xpp.getAttributeCount(); i++) {
tmp = tmp + xpp.getAttributeName(i) + " = "
+ xpp.getAttributeValue(i) + ", ";
}
if (!TextUtils.isEmpty(tmp))
Log.d(LOG_TAG, "Tag: " + xpp.getName()
+ ", Attributes: " + tmp);
}
break;
2) Либо можно XPath использовать.
http://www.ibm.com/developerworks/ru/li ... axpathapi/
Переменные:
Код: Выделить всё
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
factory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder;
builder = factory.newDocumentBuilder();
Document doc = builder.parse(getAssets().open("data.xml"));
XPathFactory xFactory = XPathFactory.newInstance();
XPath xpath = xFactory.newXPath();
XPathExpression expr = xpath.compile("//week[@number='" + week
+ "']/day[@number='" + day + "']/*");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
Log.d(LOG_TAG, "Tag: " + nodes.item(i).getLocalName() +
", Attributes: " + nodes.item(i).getAttributes().item(0).getNodeName() +
" = " + nodes.item(i).getAttributes().item(0).getNodeValue());
}
} catch (ParserConfigurationException e) {
Log.d(LOG_TAG, e.getClass() + ", " + e.getMessage());
} catch (SAXException e) {
Log.d(LOG_TAG, e.getClass() + ", " + e.getMessage());
} catch (IOException e) {
Log.d(LOG_TAG, e.getClass() + ", " + e.getMessage());
} catch (XPathExpressionException e) {
Log.d(LOG_TAG, e.getClass() + ", " + e.getMessage());
}
Переменные week и day соответствуют нужным вам значениям атрибута number соответствующих тэгов.
Оба кода выводят в лог все данные.