2012-09-03 284 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