Android:使用SAX进行XML解析时出错 - 由于“characters”中的错误“length”而导致文本被截断

时间:2014-01-24 13:47:27

标签: android xml-parsing sax

我正在使用SAX解析器,有时我遇到这个问题:在“characters”中,void的长度是错误的(4个字符而不是7个),而且我只阅读了我文本的一部分。

也许有人知道为什么我有时会遇到这个问题......

非常感谢!

以下是解析的XML文件中我遇到问题的部分(第一个元素的解析“TagPosition”是“258”而不是“258 614” - 如果完美的话,所有其余的都是!!):

XML

....
<LocationTag>
     <Tag>
          <TagID>#201401116505.1.1.2.1</TagID>
          <Zmin>0</Zmin>
          <TagPosition>258 614</TagPosition>
          <MotionNode>4</MotionNode>
          <TagPointRef>#201401116505.1.1.2</TagPointRef>
     </Tag>
     <Tag>
          <TagID>#201401116505.1.1.2.2</TagID>
          <Zmin>0</Zmin>
          <TagPosition>272 486</TagPosition>
          <MotionNode>1</MotionNode>
          <TagPointRef>#201401116505.1.1.2</TagPointRef>
     </Tag>
</LocationTag>
....

我的代码:

public class EnvironmentDataParse extends DefaultHandler{

    String TAG = "XMLHelper";

    Boolean currTag = false;
    String currTagVal = "";
    private Boolean inTag = false;

    public void get() {
        try {       
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser mSaxParser = factory.newSAXParser();
            XMLReader mXmlReader = mSaxParser.getXMLReader();
            mXmlReader.setContentHandler(this);
            mXmlReader.parse(new InputSource(getResources().openRawResource(SharedValues.EnvirFile)));  //read xml from res folder
        } catch(Exception e) {
            Log.e(TAG, "Exception: " + e.getMessage());
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(currTag) {
            currTagVal = currTagVal + new String(ch, start, length);
            currTag = false;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        currTag = false;     
        float[] currTagVal_float;

    if(localName.equalsIgnoreCase("Boundary"))
            boundary.setBoundary(currTagVal);

        else if(localName.equalsIgnoreCase("MotionNode")){
            if (inTag) {locTag.setMotionNode(currTagVal);}
            else{point.setMotionNode(currTagVal);}
        }

        else if(localName.equalsIgnoreCase("Point"))
            placePoint.add(point);

        else if(localName.equalsIgnoreCase("TagID"))
            locTag.setTagID(currTagVal);

        else if(localName.equalsIgnoreCase("TagPosition"))
        {               
            Log.i(TAG, "TAG: " + localName);
                Log.i(TAG, "currTagVal: " + currTagVal);
            locTag.setTagPosition(currTagVal);}

        else if(localName.equalsIgnoreCase("TagPointRef"))
            locTag.setTagPointRef(currTagVal);

        else if(localName.equalsIgnoreCase("Tag"))
            locationTag.add(locTag);
        }

    }

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


        currTag = true;
        currTagVal = "";
        if(localName.equals("head"))
            boundary = new BoundaryValue();

        else if(localName.equals("Tag")){
            inTag = true;
            locTag = new TagValue();}           
    }
}

LogCat 显示此信息(“258”而不是“258 614”):

01-24 14:24:46.512: D/dalvikvm(25652): Late-enabling CheckJNI
01-24 14:24:46.527: E/jdwp(25652): Failed sending reply to debugger: Broken pipe
01-24 14:24:46.527: D/dalvikvm(25652): Debugger has detached; object registry had 1 entries
01-24 14:24:46.647: I/XMLHelper(25652): TAG: TagPosition
01-24 14:24:46.647: I/XMLHelper(25652): currTagVal: 258 
01-24 14:24:46.652: I/XMLHelper(25652): TAG: TagPosition
01-24 14:24:46.652: I/XMLHelper(25652): currTagVal: 272 486
01-24 14:24:46.657: D/dalvikvm(25652): GC_CONCURRENT freed 185K, 8% free 3347K/3604K, paused 2ms+3ms, total 21ms

2 个答案:

答案 0 :(得分:2)

您的characters方法设置为仅在第一次通话时收集。

@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {
    if(currTag) {
        currTagVal = currTagVal + new String(ch, start, length);
        currTag = false;
    }
}

该行

        currTag = false;

阻止characters方法收集所有数据。它永远不能保证一起出现,而且这段代码后来调用这个方法什么都不做。

实际上我怀疑你根本不需要currTag字段,因为它仅在此方法中用作if条件,并在startElement中设置为true而在{endElement中设置为false 1}}。

您可以将此方法缩小为

@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {
    currTagVal = currTagVal + new String(ch, start, length);
}

答案 1 :(得分:0)

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


        currTag = true;
        currTagVal = "";
        if(localName.equals("LocationTag"))
            boundary = new BoundaryValue();

        else if(localName.equals("Tag")){
            inTag = true;
            locTag = new TagValue();}           
    }