SAX XML парсинг в андроид
XML-код
<?xml version="1.0" encoding="UTF-8" ?>
<opml version="1">
<head>
<title>Radio</title>
<status>200</status>
</head>
<body>
<outline type="link" text="Local" URL="http://..............." key="local" />
<outline type="link" text="Music" URL="http://.............." key="music" />
<outline type="link" text="walk" URL="http://...................." key="walk" />
<outline type="link" text="Sports" URL="http://..........." key="sports" />
<outline type="link" text="Place" URL="http://..............." key="Place" />
<outline type="link" text="Verbal" URL="http://............." key="Verbal" />
<outline type="link" text="Podcasts" URL="http://....................." key="podcast" />
</body>
</opml>
3 ответа
Я бы не стал сохранять их в векторе обязательно только в том случае, если это действительно необходимо для специальных целей. Я бы сохранил их в HashMap
вместо этого вы можете ссылаться на них по ключам.
Мне нужно увидеть вашу структуру XML, чтобы помочь вам с подробным ответом.
РЕДАКТИРОВАТЬ: Вот ваш ответ. Поздно, но все же.
Учитывая, что ваша структура XML выглядит следующим образом.
<?xml version="1.0" encoding="UTF-8" ?>
<opml version="1">
<head>
<title>Radio</title>
</head>
<body>
<outline type="link" text="Local" URL="http://google.at" key="local" />
<outline type="link" text="Music" URL="http://google.at" key="music" />
<outline type="link" text="walk" URL="http://google.at" key="walk" />
<outline type="link" text="Sports" URL="http://google.at" key="sports" />
<outline type="link" text="Place" URL="http://google.at" key="Place" />
<outline type="link" text="Verbal" URL="http://google.at" key="Verbal" />
<outline type="link" text="Podcasts" URL="http://google.at" key="podcast" />
</body>
</opml>
Чтобы получить все данные, которые вам нужно разобрать в полезную HashMap
Обработчик может выглядеть так.
import java.util.HashMap;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyContentHandler extends DefaultHandler {
private HashMap<String, Object> outlineMap;
private HashMap<String, String> outlineData;
private String key;
public void startDocument() throws SAXException {
outlineMap = new HashMap<String, Object>();
}
public void endDocument() throws SAXException {
AnotherClass.setHashMap(outlineMap);
}
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
if(qName.equalsIgnoreCase("OUTLINE")) {
outlineData = new HashMap<String, String>();
key = atts.getValue("key");
outlineData.put("type", atts.getValue("type"));
outlineData.put("text", atts.getValue("text"));
outlineData.put("URL", atts.getValue("URL"));
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equalsIgnoreCase("OUTLINE")) {
outlineMap.put(key, outlineData);
}
}
}
HashMap outlineMap
будет содержать все ваши записи плана и HashMap outlineData
будет содержать атрибуты в каждом теге структуры. Строка key
определяется потому, что он нужен для получения ключей и их правильной установки для каждого outlineData.
Как вы видите, outlineMap всегда объявляется в startDocument()
Таким образом, мы гарантируем, что каждый раз, когда вы анализируете с помощью этого обработчика, у вас будет пустой новый HashMap.
в startElement()
Метод, который мы проверяем, если полное имя тега равно OUTLINE
игнорируя случай этого. Если этот тег встречается, мы объявляем новый HashMap, чтобы мы могли хранить каждый набор атрибутов каждого тега структуры. Затем мы присваиваем значение нашей ключевой строке, анализируя значение ключа атрибутного ключа тега структуры. Затем мы передаем все другие интересные атрибуты нашим outlineData
HashMap с использованием put()
метод. Этот метод принимает только строку в качестве ключа и строку в качестве значения по нашему определению.
Теперь мы переходим к нашему endElement()
метод, который также проверяет наличие OUTLINE
опять игнорируя дело. Если это происходит, мы устанавливаем содержимое вашей первой записи outlineMap, устанавливая строку ключа из более раннего в качестве ключа, а HashMap outlineData в качестве значения. Здесь наш HashMap принимает строку в качестве своего ключа и объект в качестве его значения (он принимает практически все в качестве своего значения, поскольку все в Java на самом деле является объектом).
И теперь у вас есть готовый к использованию HashMap, заполненный проанализированными данными.
В моем примере я передаю наш последний HashMap outlineMap сеттеру в другом классе в методе endDocument(). Это означает, что когда разбор завершен.
Вот краткое объяснение того, как SAX-парсер использует эти методы, чтобы вы лучше поняли, что происходит.
ON DOCUMENT START
startDocument() gets called
ON STARTING TAG : <TAG> or <TAG attribute="123">
startElement() gets called when a starting tag appears.
here you can decide which tag to look at and which attributes
to parse.
ON INNERTAG DATA : DATA
characters() gets called building a char array of characters.
ON END TAG : </TAG>
endElement() gets called when the ending tag appears.
ON DOCUMENT END
endDocument() gets called
Конечно, есть несколько других доступных методов, но для вас эти методы являются наиболее интересными прямо сейчас. Метод символов может не быть таким интересным для ваших реальных потребностей.
Я надеюсь, что это помогает. Если вам нужно узнать больше, просто спросите по комментарию.
Это общий XML-парсер
перейдите по ссылке http://androidosbeginning.blogspot.com/2010/09/generic-xml-parsing-in-android.html
надеюсь, это решит проблему, с которой вы столкнулись.
SAX: простой xml-разбор. Он анализирует узел за узлом. Перемещение осуществляется сверху вниз. Низкое использование памяти. С помощью sax навигация назад невозможна.
//implementing required handlers
public class SaxParse extends DefaultHandler{ }
//new instance of saxParserFactory
SAXParserFactory factory=SAXParserFactory.newInstance();
//NEW INSTANCE OF SAX PARSER
SAXParser saxparser=factory.newSAXParser();
//Parsing xml document
SAXParser.parse(new File(file to be parsed), new SAXXMLParserImpl());