2012-09-03 243 views
2

我想用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); 
} 
+1

有很多关于SAX解析的教程。 SO不是你通过发布问题获得计划的地方。在发布求助信息之前,您需要展示自己的努力。 – kosa

+0

此外,在未来,您尝试过的代码的一些示例会很有帮助,所以我们不会浪费对方时间咆哮错误代码路径 – MadProgrammer

+0

其中是您的java代码 –

回答

3

如果您使用的是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 

所以我不知道你在做什么。

+0

向第一篇文章添加代码。我已经通过网络教程和谷歌搜索。把这个特殊的情况不讨论。 – Reddy

+0

更新示例 – MadProgrammer

+0

但上面的for循环提取所有属性(包括从父节点级联)。因此它将包含ACCOUNT属性,如登录,sknum也。 – Reddy