【问题标题】:Can anyone help me with an android XML parser?任何人都可以帮助我使用 android XML 解析器吗?
【发布时间】:2012-05-31 23:37:39
【问题描述】:

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

这是我定义变量的类。它们都应该处理多个值,除了 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,如果可能的话,我希望将它们放在一个多维数组中。

【问题讨论】:

  • 为了完整起见,您能否编辑您的答案以包含您尝试解析的实际 XML?
  • 感谢您的快速回答,我已经使用 XML 编辑了我的帖子,希望您能帮助我:)
  • 我不确定我是否会回答这个问题,因为我已经需要睡觉了 :)。但是,你能尽可能多地发布你的活动吗?乍一看,我看到了大约 3 个可能的问题点,但目前我不能确定是哪一个导致了这个错误。
  • 在mainclass中,在线程之后,我没有任何可能导致问题的东西,但我也已经编辑过,所以你可以看到我的完整代码。
  • 检查此 [LINK][1]。这里,使用 sax [1] 进行 XML 解析:stackoverflow.com/questions/6209793/…

标签: android xml multithreading parsing


【解决方案1】:

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

关于线程的官方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/

希望对你有帮助

【讨论】:

    【解决方案2】:

    我仍然认为缺少一些代码,但为了不让您陷入困境,这里有几处可能是错误的:

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

    还有一些小问题:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多