【问题标题】:Seemingly random SAX output error看似随机的 SAX 输出错误
【发布时间】:2012-01-30 14:43:06
【问题描述】:

我正在创建一个 Android 应用程序,该应用程序应该使用 SAX (javax.xml.parsers.SAXParser) 来解析包含不同位置信息的 XML 文件,以便这些位置可以在地图上显示为点;不幸的是,我的解析器有问题。

XML 文件由 1000 多个重复组组成,如下所示:

<Placemark id="00001">
  <name>Place name</name>
  <address>Place address</address>
  <ExtendedData>
    <Data name="postcode">
      <value>Place postcode</value>
    </Data>
  </ExtendedData>
  <Point>
    <coordinates>-0.000000,51.000000</coordinates>
  </Point>
</Placemark>

我的 XML 处理程序检查当前元素的名称,然后将该元素的值添加到相关列表中,即

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

    if(localName.equals("placemark")) list.setPlaceID(attributes.getValue("id"));
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {

    if(localName.equals("name")) list.setName(currentValue);
    else if(localName.equals("address")) list.setAddress(currentValue);
    else if(localName.equals("value")) list.setPostCode(currentValue);
    else if(localName.equals("coordinates")) System.out.println(currentValue);  
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException{

    currentValue = new String(ch, start, length);
}

这成功处理了 99.9% 的情况,但由于某种原因,我无法弄清楚有一些特定的 XML 坐标元素在解析时会产生意外的输出,例如:

  1. &lt;coordinates&gt;-0.328459,51.604121&lt;/coordinates&gt; 产生 4121 而不是 -0.328459,51.604121

  2. &lt;coordinates&gt;-0.060226,51.602341&lt;/coordinates&gt; 产生 26,51.602341 而不是 -0.060226,51.602341

更令人困惑的是,如果有问题的元素是孤立的,那么它们可以毫无问题地被解析。只有当要解析非常大的数字时,才会有少数几个会导致此问题。

是否有任何明显的解释可以解释这些结果?

【问题讨论】:

    标签: java android xml-parsing sax


    【解决方案1】:

    使用

    currentValue += new String(ch, start, length);
    

    并将其初始化为

    currentValue = ""; 
    

    在 endElement 使用后。

    原因是标签的内容在有分词的地方以多个块的形式发送。所以你需要连接它。

    【讨论】:

    • 太棒了!这工作得很好,我不再收到任何意外的输出。非常感谢您的帮助!
    • 乐于助人!使用 StringBuilder.append 而不是字符串连接。这在某些情况下会提高性能,这是一种最佳做法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多