Страница 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/

Переменные:

Код: Выделить всё

	String week = "2";
	String day = "2";

Код: Выделить всё

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 соответствующих тэгов.

Оба кода выводят в лог все данные.