我不会将它们保存在一个向量中,只有当你真的需要特殊目的。我会将它们保存在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,这样我们可以保存每个大纲标签的每个属性集合。然后我们通过解析大纲标签的属性键的键值来为我们的键字符串赋值。然后我们使用put()
方法将其他所有有趣的属性传递给我们的outlineData
HashMap。这个方法只接受一个字符串作为键和一个字符串作为我们定义的值。
现在我们继续讨论我们的endElement()
方法,该方法还会检查OUTLINE
再次忽略该情况的发生。如果发生这种情况,我们通过将前面的键字符串设置为键并将outlineData HashMap设置为值来设置第一个outlineMap条目的内容。这里我们的HashMap接受一个字符串作为它的键值和一个对象作为它的值(它接受几乎所有的值,因为Java中的所有东西都是一个实际的对象)。
现在你已经准备好使用填充解析数据的HashMap了。
在我的示例中,我将最终的HashMap outlineMap传递给endDocument()方法中另一个类的setter。这意味着解析完成。
下面是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代码是 <?XML版本= “1.0” 编码= “UTF-8”?>无线电 <轮廓类型= “链接” text =“Local”URL =“http://”key =“local”/> < outline =“link”text =“walk”URL =“http:// ...”key =“walk”/> opml –
kites
2010-09-24 05:28:47
@Octavian:+1我一直在试图找出一种将泛型SAX解析成HashMap几天的方法。它不像上面的示例代码,但是这足以让我知道从哪里开始。谢谢。 – Squonk 2011-12-23 09:50:03