【问题标题】:Android XML parsing issues using SAX parser使用 SAX 解析器的 Android XML 解析问题
【发布时间】:2012-12-26 20:46:11
【问题描述】:

我正在解析资产文件夹中的 XML 文件,以将我的数据转储到数据库中。稍后我可能会获取它并将其显示在文本视图中。但是在解析时我丢失了一些数据,即如果我在解析之前在 XML 标记中有大约 50 个单词,在我的数据库中我无法在解析后找到所有这些。

例如: 我正在解析这一行:

<about>Skandagiri also known as kalavara durga, is an ancient mountain fortess located approximately 70km from Banglore city and 3 km from Chikkaballapur in the Indian State of Karnataka.It is off Bellary road(NH 7, Hyderabad to Bangalore Highway) and overlooks Nandi Hills, Mudddenahalli and Kanive narayanapura.The peak is at an altitude of about 1350 meters</about>

在我的数据库中解析后:

at an altitude of about 1350 

我正在使用 String 来保存我的解析值,如下所示:

if (element.equalsIgnoreCase("about")){
  String str=parsedValue;
}   

【问题讨论】:

  • 你存储字符串的数据库列是什么数据类型,它的大小是多少?
  • 没有看到您的解析代码,我只能猜测:SAX 解析器可能会以您必须连接的块的形式提供内容。您似乎只返回了最后一个块。
  • 你可能是对的,但是当我删除最后一行时,即如果我只输入这一行,我得到了正确的字符串::::Skandagiri 也被称为 kalavara durga,是一座古老的山地堡垒距离班洛尔市约 70 公里,距离印度卡纳塔克邦的奇卡巴拉普尔 3 公里。位于贝拉里路(NH 7,海得拉巴至班加罗尔高速公路)旁,可俯瞰南迪山、穆德纳哈利和卡尼维纳拉亚纳普拉。
  • 如果您在将其插入数据库之前尝试将其打印到 LogCat,您会得到整个字符串吗?
  • 没有。我没有得到整个字符串。我得到了错误的日志。

标签: android xml-parsing android-xml


【解决方案1】:

如果您使用的是 SAXparser,最好使用 StringBuffer 包装数据。
查看官方文档:ContentHandler.
这是其中有趣的部分:

解析器将调用此方法来报告每个字符数据块。 SAX 解析器可以在单个块中返回所有连续的字符数据,也可以将其拆分为多个块;但是,任何单个事件中的所有角色都必须来自同一个外部实体,以便定位器提供有用的信息。

【讨论】:

  • 我用这种方式使用字符串缓冲区,但问题仍然存在。我是否正确使用了字符串缓冲区?:::if (element.equalsIgnoreCase("about")) { StringBuffer strbuf = new StringBuffer(); strbuf.append(parsedValue);字符串 str=strbuf.toString(); }
  • 你需要在“characters(char[] ch, int start, int length)”上追加到StringBuffer
  • 我无法解决这个问题。你能帮忙吗?;;;public void characters(char[] ac, int i, int j) throws SAXException { StringBuffer strbuf = new StringBuffer(); strbuf.append(new String(ac, i, j)); parsedValue = strbuf.toString(); }
  • 您需要将 ch 附加到已在函数外部创建的对象,否则您每次只需使用当前值创建它。
【解决方案2】:

请尝试下面的代码..我认为解决了您的问题。

  Element element = (Element) node.item(i);

  NodeList id = element.getElementsByTagName("about");
  Element line1 = (Element) id.item(0);
  if (null != line1)

      AdsFound[i] = getCharacterDataFromElement(line1);

  else

      AdsFound[i] = "";

【讨论】:

    【解决方案3】:

    使用 StringBuffer,因为可以分块读取文本,而您可能只阅读部分代码。 使用字符串缓冲区并附加所有块,这样最终您将获得完整的文本而不会丢失任何数据。

    像这样:

    StringBuffer strbufr = new StringBuffer();
    
        if (element.equalsIgnoreCase("about")){
          String str = strbufr.toString().trim();
        }  
    
        @Override
            public void characters(char[] ac, int i, int j) throws SAXException {
                strbufr.append(ac, i, j);
            }
    

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多