SAX XML парсинг в андроид - PullRequest
       6

SAX XML парсинг в андроид

2 голосов
/ 23 сентября 2010

Код 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 ]

5 голосов
/ 24 сентября 2010

Я бы не стал сохранять их в векторе обязательно только в том случае, если это действительно необходимо для специальных целей Вместо этого я бы сохранил их в 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

Конечно, есть несколько других доступных методов, но для вас эти методы являются наиболее интересными прямо сейчас. Метод символов может не быть таким интересным для ваших реальных потребностей, хотя.

Надеюсь, это поможет. Если вам нужно узнать больше, просто спросите по комментарию.

0 голосов
/ 09 ноября 2012

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());
0 голосов
/ 23 сентября 2010

Это общий xml-парсер

перейти по ссылке http://androidosbeginning.blogspot.com/2010/09/generic-xml-parsing-in-android.html

надеюсь, что это решит проблему, с которой вы столкнулись.

...