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