【问题标题】:Android : Reading XML from local resource (for testing)Android:从本地资源读取 XML(用于测试)
【发布时间】:2011-02-24 23:13:06
【问题描述】:

我正在编写一个应用程序,它将从 Web 服务(可能通过 kSOAP2)读取 XML。我对 SAX 解析相当满意,因为我已经完成了对 iPhone 应用程序的 XML 解析。

不幸的是,网络服务尚未公开,因此对于初始测试,我有一些包含我需要解析的 XML 的文件。在这个早期的开发阶段,我只需要从文件中读取 XML 并将其传递给 XML 解析器

Xml.parse(this.testXML, root.getContentHandler());

如何将文件/资源​​中的 XML 读入字符串以传递给此方法。我想破解并测试解析器,但这个简单的步骤让我受不了。

谢谢

【问题讨论】:

    标签: android xml parsing file


    【解决方案1】:

    在res下创建一个raw文件夹

    将您的 XML 文件放在那里,例如。 testXML.xml:

    /res/raw/testXML.xml

    您应该能够将 XML 解析器用作输入流:

    Xml.parse(getResources().openRawResource(R.raw.testXML), Xml.Encoding.UTF_8, root.getContentHandler());
    

    试试看。

    【讨论】:

      【解决方案2】:

      我找到了解决方案。使用资产。 这是我如何做到的简单代码示例。 我知道我可以使用 XmlPullParser 简单地从 res 加载 xml 文件,但我想使用 SAX 解析。这使我可以在插入 Web 服务之前简单地将 XML 字符串放入 SAX 解析器进行测试。

      它现在只是使用一个简单的视图和一个 Button 来启动文件加载和一个 TextView 来显示 XML。我可以继续使用我的解析器:)

      package com.martins.XmlParserTest
      import java.io.IOException;
      import java.io.InputStream;
      
      import android.app.Activity;
      import android.content.res.AssetManager;
      import android.os.Bundle;
      import android.util.Log;
      import android.view.View;
      import android.view.View.OnClickListener;
      import android.widget.Button;
      import android.widget.TextView;
      
      public class Main extends Activity {
      
      Button btn;
      TextView tvXml;
      
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
      
          Button btn = (Button) findViewById(R.id.button1);
      
          btn.setOnClickListener(new OnClickListener() {
      
              @Override
              public void onClick(View v) {
                  // Load XML for parsing.
                  AssetManager assetManager = getAssets();
                  InputStream inputStream = null;
                  try {
                      inputStream = assetManager.open("textxml.xml");
                  } catch (IOException e) {
                      Log.e("tag", e.getMessage());
                  }
      
                  String s = readTextFile(inputStream);
                  TextView tv = (TextView)findViewById(R.id.textView1);
                  tv.setText(s);
              }
          });
      }
      
      
      private String readTextFile(InputStream inputStream) {
          ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
      
          byte buf[] = new byte[1024];
          int len;
          try {
              while ((len = inputStream.read(buf)) != -1) {
                  outputStream.write(buf, 0, len);
              }
              outputStream.close();
              inputStream.close();
          } catch (IOException e) {
      
          }
          return outputStream.toString();
      }
      }
      

      【讨论】:

      • 哦,忘了说。 XML 文件需要放在项目的 /assets 文件夹中。希望其他人有一天会发现这很有用。
      • Martin,您是否尝试按照我所说的将 XML 转换为原始格式?我做了一个测试项目,发现如果将 XML 放入名为“raw”而不是“xml”的文件夹中,它就可以工作。我不确定为什么它会有所作为,但确实如此。我只是喜欢高效的解决方案,一条线绝对是非常高效的:)
      • 我相信“原始”xml 文件作为文件存储在资产中,而“xml”xml 文件存储为预解析的 xml(通过 XmlResourceParser)。
      【解决方案3】:

      由于格式不正确的 XML (line1,Pos0) 引发异常。

      您告诉解析器编码是 UTF-8,如果不是,您可能会遇到各种错误(取决于解析器)。如果您使用非 xml 编辑器来编辑您的 XML,它可能会以不同的编码保存文件,无论您在 XML 文档中声明它是什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多