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());
Другие вопросы по тегам