2

我一直在努力尝试在一个小测试 android 应用程序中解析一个基本的 xml 文件。

我的代码如下:

InputStream is = getResources().openRawResource(R.xml.content);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
try {
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
      Document doc = dBuilder.parse(is,"UTF-8"); //Blows up right here.
      // Bunch more stuff here
}

我的 xml 如下所示:

<?xml version="1.0" ?>
<main>
    <background>
        <defintion>This is a test</defintion>
    </background>
</main>

问题是当我尝试解析这个时,我得到一个org.xml.sax.SAXParseException: Unexpected token (position:TEXT unprintable characters here ...@3:252 in java.io.InputStreamReader@411f3898)错误。我四处搜索,发现所有其他解决方案似乎都不起作用。

我仔细检查了该文件是否为 UTF-8,并使用 notepad++ 在 UTF-16 和 UTF-8 之间来回更改了它的编码(尝试使用和不使用 BOM),并更新了程序以正确反映这一点,但无论如何我有,我总是得到这个错误。我敢肯定我一定是遗漏了一些非常明显的东西,但无论我尝试什么系列的组合,这总是失败。

4

2 回答 2

1

我遇到了和你一样的问题。我终于找到了解决方案:

永远不要把你的 xml 放在 res/xml 中。xml文件会被android sdk编码,因此无法正确读取。但是,当你把它放在 res/raw 中时,导出到应用程序的 xml 文件将是完整的。

于 2013-04-16T12:25:43.617 回答
1

首先将您的content.xml文件放在res/raw文件夹中,然后将其解析为:

您的 xml 文件res/raw/content.xml

<?xml version="1.0" encoding="utf-8"?>
<main>
    <background>
        <defintion>This is a test</defintion>
    </background>
</main>

并将其解析为:

  InputStream is = getResources().openRawResource(R.raw.content);
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();

        DocumentBuilder dBuilder;
            try {
                dBuilder = dbFactory.newDocumentBuilder();
                try {
                    Document doc = dBuilder.parse(is,"UTF-8");
                    NodeList nl = doc.getElementsByTagName("main");

                    System.out.println("NodeList NodeList"+nl.getLength());

                } catch (SAXException e) {
                    // TODO Auto-generated catch block

                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } //Blows up right here.
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
于 2012-10-17T05:08:41.403 回答