任何人都可以帮我一个Android XML解析器?

时间:2012-05-31 23:37:39

标签: android xml multithreading parsing

我不会寻求帮助,我总是做我的研究,并试图自己找到解决方案,但这次我真的被卡住了...... 我对一些语言有很多经验,但不是用java ... 所以,我要做的是一个具有动态布局的应用程序,并从特定主机上的XML文件加载它。 我的第一个问题是,显然,从主线程中读取XML是不可能的,所以我必须学习线程和Asynctaks,我决定使用一个简单的线程并将值存储在我创建的一些全局变量中,但它不起作用...... 我也尝试将SAX用于XML解析器,但我更喜欢DOM。 我只是试着做了3天以上,我对此变得有点生气,我希望有人可以帮助我,这是我的代码:

这是我定义我的vars的类。它们都应该处理多个值,除了XML之外,它将存储XML的URL以在线程中使用它。

public class Info {
        public static String Param1[];
        public static String Param2[];
        public static String Param3[];
        public static String Param4[];
        public static String Param5[];
        public static String Param6[];
        public static String XML;
}

这是我的主线:

//Create the basic layout
ScrollView sv = new ScrollView(this);
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.VERTICAL);
    sv.addView(ll);
Info.XML="mylink";
Thread thread = new Thread()
{
    @Override
    public void run() {
        try {
            URL url = new URL(Info.XML);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new InputSource(url.openStream()));
            doc.getDocumentElement().normalize();
            NodeList ActionContainers = doc.getElementsByTagName("ActionContainer");
            Node mainContainer = ActionContainers.item(0);
            Element Container = (Element) mainContainer;
            NodeList Actions = Container.getElementsByTagName("Action");
            for (int i = 0; i < Actions.getLength(); i++) {
                Node mainAction = Actions.item(i);
                Element Action = (Element) mainAction;
                Info.Param1[i]=Action.getAttribute("Param1");
                Info.Param2[i]=Action.getAttribute("Param2");
                Info.Param3[i]=Action.getAttribute("Param3");
                Info.Param4[i]=Action.getAttribute("Param4");
                Info.Param5[i]=Action.getAttribute("Param5");
                Info.Param6[i]=Action.getAttribute("Param6");
            }
        } catch (Exception e) {
            Info.XML="Erro";
        }
    }
};
try{
    thread.start();
} catch(Exception e){
    Info.XML="Erro";
}

    EditText et = new EditText(this);
        et.setText(Info.XML);
        ll.addView(et);
        setContentView(sv);

没有检测到异常,它只是不返回xml信息...... 我希望有人能在这里给我一些帮助。

由于

编辑:

这是XML:

<appname Version="yyy" WrittenOn="yyy">
<Config>
    <Page Id="yyy">
        <ActionContainer Id="yyy">
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            ...
        </ActionContainer>
    </Page>
</Config>

我需要所有xxx,如果可能的话,我希望将它们放在多层阵列上。

2 个答案:

答案 0 :(得分:0)

我仍然认为缺少一些代码,但为了不让你陷入困境,这里有几件可能出错的事情:

  • 你可能实际上没有得到异常,因为et.setText(Info.XML);可能会在你的线程完成之前执行,忽略“ErrNo”。我对此的说明:
    • 可能是您的XML文件的URL错误(请记住,对于远程文档,您需要在应用中获得INTERNET权限),
    • 您发布的XML无效:<appname>未关闭和/或没有根元素。
    • 您似乎无法在任何地方初始化Info.ParamX数组,这将导致NullPointerException
    • 即使您初始化它们,也不会考虑Actions.getLength()的大小,这可能会导致ArrayIndexOutOfBoundsException或类似;换句话说,在Info.ParamX = new String[Actions.getLength()];循环之前添加for
    • 除此之外,您的解析代码似乎工作正常。要正确调试代码,使用ADT中的Debug选项,或使用System.out.println()在catch子句中输出异常,并在LogCat 中检查它。
  • 此代码位于何处?如果它不在您的活动的onCreate()中,请将其放在那里。

此外,还有一些小问题:

  • 尝试对您的Java字段和变量使用camelBack表示法,这将使您的代码对Java程序员更具可读性。
  • 使用Thread进行一次性应用是可以的,但您应该一般避免使用它,例如:将其替换为AsyncTask(您已阅读过)。

PS。在ParamX中,X当然是1到6之间的每个整数。

答案 1 :(得分:0)

您应该尝试使用Thread而不是AsyncTask。见这里:

关于线程的官方android页面非常好 http://developer.android.com/resources/articles/painless-threading.html

http://developer.android.com/reference/android/os/AsyncTask.html

这也解释得很好 http://labs.makemachine.net/2010/05/android-asynctask-example/

关于XML解析我的应用程序依赖于从HTTP请求中提取的大量XML,我发现SAX解析器非常好并且一旦你开始使用就很容易使用。

关于SAX示例,自从解决以来它一直是时间,但我在书签中发现这个例子,希望它有所帮助。只需阅读SAX部件 http://www.ibm.com/developerworks/xml/library/x-android/

希望有所帮助