首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAX解析器从SAX元素获取属性

SAX解析器从SAX元素获取属性
EN

Stack Overflow用户
提问于 2014-02-17 06:41:30
回答 2查看 5.4K关注 0票数 6

我使用SAX解析器,当我使用:

代码语言:javascript
复制
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException

我可以得到属性。但我需要从public endElement获取属性。

要解析类似的内容:

代码语言:javascript
复制
<item name="test" value="somedata" />

代码:

公共类SAXXMLHandler扩展DefaultHandler {

代码语言:javascript
复制
private ArrayList<itemsList> items;
private String tempVal;
private itemsList tempEmp;

private PackageManager manager;
private String packName;

public SAXXMLHandler(PackageManager manager, String packName) {
    items = new ArrayList<itemsList>();

    this.manager = manager;
    this.packName = packName;

}

public void characters(char[] ch, int start, int length)
        throws SAXException {
    tempVal = new String(ch, start, length);
}

// Event Handlers
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
    Log.d("INFO", "startElement " + localName + ", " + qName + ", " + attributes);
    // reset
    tempVal = "";
    if (qName.equalsIgnoreCase("item")) {
        // create a new instance of employee
        tempEmp = new itemsList();
        tempEmp.setName(attributes.getValue("name"));
    }
}

public void endElement(String uri, String localName, String qName)
        throws SAXException {
    Log.d("INFO", "endElement " + localName + ", " + qName);

}

也不要在startElement上写日志

更新

我用零碎的:

代码语言:javascript
复制
SAXXMLHandler handler = new SAXXMLHandler();
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            saxParser.parse(asset, handler);
            items = SAXXMLHandler.icons;

            Util.l(String.valueOf(SAXXMLHandler.icons.size())); //log
            for(itemList item:SAXXMLHandler.icons)
            {
                Util.l(item.getComponent()+"\t\t"+item.getComponent()); //log
            }

SAXXMLHandler看:

代码语言:javascript
复制
public class SAXXMLHandler extends DefaultHandler {

    public static ArrayList<itemsList> items;
    private itemsList item;

    public SAXXMLHandler() {
        items = new ArrayList<itemsList>();
    }

    public void characters(char[] ch, int start, int length)
            throws SAXException {

    }

    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        item = new itemsList();
        Log.d("INFO", "startElement " + localName + ", " + qName);
        if (qName.equalsIgnoreCase("item")) {
            item.setComponent(attributes.getValue("component"));
            items.add(item);
        }
    }

    public void endElement(String uri, String localName, String qName)
            throws SAXException {

    }
}

仍然什么也没有/

我解析http://pastebin.com/5GEthfmU的其他应用程序中的XML文件

EN

回答 2

Stack Overflow用户

发布于 2014-02-17 06:46:31

将System.out.println更改为ur Log.ins .

项目.java

代码语言:javascript
复制
package com.rofl;

public class Item {

    private String component;

    private String  drawable;

    public String getComponent() {
        return component;
    }

    public void setComponent(String component) {
        this.component = component;
    }

    public String getDrawable() {
        return drawable;
    }

    public void setDrawable(String drawable) {
        this.drawable = drawable;
    }



}

SAXXMLHandler .java

代码语言:javascript
复制
    package com.rofl;

import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXXMLHandler extends DefaultHandler {



    public static void main(String argv[]) {

        try {

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            SAXXMLHandler handler = new SAXXMLHandler();
            saxParser.parse("src/file.xml", handler);
            System.out.println(SAXXMLHandler.itemList.size());
            for(Item item:itemList)
            {
                System.out.println(item.getComponent()+"\t\t"+item.getDrawable());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static List<Item> itemList = new ArrayList<Item>();

    private Item item;

    public SAXXMLHandler() {
        itemList = new ArrayList<Item>();

    }

    public void characters(char[] ch, int start, int length)
            throws SAXException {

    }

    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        item = new Item();
        if (qName.equalsIgnoreCase("item")) {
            item.setComponent(attributes.getValue("component"));
            item.setDrawable(attributes.getValue("drawable"));
            itemList.add(item);

        }
    }

    public void endElement(String uri, String localName, String qName)
            throws SAXException {

    }
}

产出如下:

代码语言:javascript
复制
8
ComponentInfo{com.designrifts.ultimatethemeui/ultimatethemeui.themeactivity}        icon
ComponentInfo{com.chrislacy.actionlauncher.pro/com.chrislacy.launcher.Launcher}     apps_actionlauncherpro
ComponentInfo{com.teslacoilsw.launcher/com.android.launcher2.Launcher}      apps_novalauncher
ComponentInfo{com.teslacoilsw.launcher.prime/.NovaLauncherPrimeActivity}        apps_novalauncher
ComponentInfo{com.anddoes.launcher/com.anddoes.launcher.Launcher}       apps_apexlauncher
ComponentInfo{com.anddoes.launcher.pro/com.anddoes.launcher.pro.ApexLauncherProActivity}        apps_apexlauncher
ComponentInfo{org.adw.launcher/org.adw.launcherlib.Launcher}        apps_adwlauncher
ComponentInfo{org.adwfreak.launcher/org.adw.launcherlib.Launcher}       apps_adwex
票数 1
EN

Stack Overflow用户

发布于 2014-02-17 07:18:59

在给定的XML行中。

代码语言:javascript
复制
<item name="test" value="somedata" />

namevalue是只能在startElement()方法中检索的属性。因为,Attributes attributes参数只传递给startElement(String uri, String localName, String qName, Attributes attributes)方法。如果您查看endElement(String uri, String localName, String qName)方法,就会发现没有Attributes attributes。这就是为什么不能从endElement()方法中检索任何属性的原因。因此,如果您想从一个attributes中检索任何XML,那么就必须在startElement(String uri, String localName, String qName, Attributes attributes)方法中检索它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21822401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档