首页 文章

用SAX Parser解析Xml

提问于
浏览
2

我试图用SAX Parser解析一个xml文件 . 我需要获取属性和它的start元素的值

<?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中,我需要获取Settings标签/ start元素属性及其值 .

这些属性是动态的,所以我试图制作它们的 Map . 我是SAX Parser的新手 .

到目前为止我的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 回答

  • 3

    如果您使用的是DefaultHandler,那么您将收到 startElement 事件 .

    此方法将Attributes作为其中一个参数 .

    您将需要使用getIndex(String)来获取指定属性的索引,并使用getValue(int)来获取所述属性的值 .

    正如Nambari指出的那样,互联网上有数以百计的教程,而且关于这个主题的帖子还有几篇(我周末回答了一个) .

    UPDATED

    我建议应该看起来像这样(我没有测试过)

    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);
        }
    
    }
    

    UPDATED with tested example

    我带了你的数据(来自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
    

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

相关问题