我正在使用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
答案 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();}
}