用SAX解析器解析XML
我想用SAX解析器解析XML文件。 我需要的属性,这是一个开始元素用SAX解析器解析XML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<API type="Connection">
<INFO server="com.com" function="getAccount2" />
<RESULT code="0">Operation Succeeded</RESULT>
<RESPONSE numaccounts="1">
<ACCOUNT login="fa051981" skynum="111111" maxaliases="1" creationdate="Fri Nov 16 00:59:59 2001" password="pass" type="2222" status="open" mnemonic="32051981" ratelimit="0">
<CHECKATTR />
<REPLYATTR>Service-Type = Frames-User, Framed-Protocol = PPP, Framed-Routing = None</REPLYATTR>
<SETTINGS bitval="4" status="open" />
<SETTINGS bitval="8192" status="open" session_timeout="10800" />
<SETTINGS bitval="32768" status="open" cisco_address_pool="thepool" />
<ALIASES numaliases="0" />
</ACCOUNT>
</RESPONSE>
</API>
的价值在该XML,我需要设置标签/开始元素的属性以及它的价值。
这些属性是动态的,所以我想制作一张他们的地图。我是SAX解析器的新手。
到目前为止,我的Java代码:
public void startElement(String s, String s1, String elementName, Attributes attributes) throws SAXException {
if (elementName.equalsIgnoreCase(GenericConstants.INFO)) {
this.searchRaidusBean.setServer(attributes.getValue(GenericConstants.SERVER));
this.searchRaidusBean.setFunction(attributes.getValue(GenericConstants.FUNCTION));
}
if (elementName.equalsIgnoreCase(GenericConstants.RESULT)) {
this.searchRaidusBean.setResultCode(attributes.getValue(GenericConstants.CODE));
}
if (elementName.equalsIgnoreCase(GenericConstants.ACCOUNT)) {
this.searchRaidusBean.setLoginId(attributes.getValue(GenericConstants.LOGIN));
}
if (elementName.equalsIgnoreCase(GenericConstants.ACCOUNT)) {
this.searchRaidusBean.setSkyNum(attributes.getValue(GenericConstants.SKYNUM));
}
if (elementName.equalsIgnoreCase(GenericConstants.ACCOUNT)) {
this.searchRaidusBean.setMaxAliases(attributes.getValue(GenericConstants.MAXALIASES));
}
if (elementName.equalsIgnoreCase(GenericConstants.ACCOUNT)) {
this.searchRaidusBean.setCreationDate(attributes.getValue(GenericConstants.CREATION_DATE));
}
if (elementName.equalsIgnoreCase(GenericConstants.ACCOUNT)) {
this.searchRaidusBean.setType(attributes.getValue(GenericConstants.TYPE));
}
if (elementName.equalsIgnoreCase(GenericConstants.ACCOUNT)) {
this.searchRaidusBean.setStatus(attributes.getValue(GenericConstants.STATUS));
}
if (elementName.equalsIgnoreCase(GenericConstants.ACCOUNT)) {
this.searchRaidusBean.setMnemonic(attributes.getValue(GenericConstants.MNEMONIC));
}
if (elementName.equalsIgnoreCase(GenericConstants.ACCOUNT)) {
this.searchRaidusBean.setRateLimit(attributes.getValue(GenericConstants.RATELIMIT));
}
if (elementName.equalsIgnoreCase(GenericConstants.SETTINGS)) {
//this.searchRaidusBean.getBitval().add(attributes.getValue(GenericConstants.BITVAL));
System.out.println(attributes);
//stuck here
}
if (elementName.equalsIgnoreCase(GenericConstants.ALIASES)) {
this.tempKey = attributes.getValue(GenericConstants.MNEMONIC);
}
}
public void endElement(String str1, String str2, String element) throws SAXException {
if (element.equalsIgnoreCase(GenericConstants.RESULT)) {
this.searchRaidusBean.setResultMessage(this.tempValue);
}
if (element.equalsIgnoreCase(GenericConstants.ALIASES)) {
if (!StringUtils.isBlank(this.tempKey)) {
this.searchRaidusBean.getAlias().put(this.tempKey, this.tempValue);
}
}
}
public void characters(char[] charArray, int i, int j) throws SAXException {
this.tempValue = new String(charArray, i, j);
}
如果您使用的是DefaultHandler,那么您将收到一个startElement
事件。
此方法携带Attributes作为其参数之一。
您将需要使用getIndex(String)来获取指定属性的索引,并使用getValue(int)来获取该属性的值。
正如Nambari指出的,在互联网上有数百个教程,并且在这个主题上有几个帖子(我在周末回答了一个)。
修订
我建议它应该是这个样子(我没有测试它)
public void startElement(String uri, String localName, String elementName, Attributes attributes) throws SAXException {
if (elementName.equalsIgnoreCase(GenericConstants.INFO)) {
this.searchRaidusBean.setServer(attributes.getValue(GenericConstants.SERVER));
this.searchRaidusBean.setFunction(attributes.getValue(GenericConstants.FUNCTION));
}
if (elementName.equalsIgnoreCase(GenericConstants.RESULT)) {
this.searchRaidusBean.setResultCode(attributes.getValue(GenericConstants.CODE));
}
if (elementName.equalsIgnoreCase(GenericConstants.ACCOUNT)) {
this.searchRaidusBean.setLoginId(attributes.getValue(GenericConstants.LOGIN));
this.searchRaidusBean.setSkyNum(attributes.getValue(GenericConstants.SKYNUM));
this.searchRaidusBean.setMaxAliases(attributes.getValue(GenericConstants.MAXALIASES));
this.searchRaidusBean.setCreationDate(attributes.getValue(GenericConstants.CREATION_DATE));
this.searchRaidusBean.setType(attributes.getValue(GenericConstants.TYPE));
this.searchRaidusBean.setStatus(attributes.getValue(GenericConstants.STATUS));
this.searchRaidusBean.setMnemonic(attributes.getValue(GenericConstants.MNEMONIC));
this.searchRaidusBean.setRateLimit(attributes.getValue(GenericConstants.RATELIMIT));
}
if (elementName.equalsIgnoreCase(GenericConstants.SETTINGS)) {
for (int index = 0; index < attributes.getLength(); index++) {
String attName = attributes.getLocalName(index);
String value = attributes.getValue(index);
map.put(attName, value);
}
}
if (elementName.equalsIgnoreCase(GenericConstants.ALIASES)) {
this.tempKey = attributes.getValue(GenericConstants.MNEMONIC);
}
}
更新了测试例如
我把你的数据(来自OP)并通过以下处理程序运行:
DefaultHandler handler = new DefaultHandler() {
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("settings")) {
System.out.println("Parse settings attributes...");
for (int index = 0; index < attributes.getLength(); index++) {
String aln = attributes.getLocalName(index);
String value = attributes.getValue(index);
System.out.println(" " + aln + " = " + value);
}
}
}
};
而且我得到了下面的输出
Parse settings attributes...
bitval = 4
status = open
Parse settings attributes...
bitval = 8192
status = open
session_timeout = 10800
Parse settings attributes...
bitval = 32768
status = open
cisco_address_pool = thepool
所以我不知道你在做什么。
向第一篇文章添加代码。我已经通过网络教程和谷歌搜索。把这个特殊的情况不讨论。 – Reddy
更新示例 – MadProgrammer
但上面的for循环提取所有属性(包括从父节点级联)。因此它将包含ACCOUNT属性,如登录,sknum也。 – Reddy
有很多关于SAX解析的教程。 SO不是你通过发布问题获得计划的地方。在发布求助信息之前,您需要展示自己的努力。 – kosa
此外,在未来,您尝试过的代码的一些示例会很有帮助,所以我们不会浪费对方时间咆哮错误代码路径 – MadProgrammer
其中是您的java代码 –