我有一个我想解析的XML。
<Tests>
<Test>
<Blocks>
<Block>
<BlockId>2</BlockId>
<Name>CCCC</Name>
<Type>Action</Type>
<TaskId>2</TaskId>
<Send>
<WId>284</WId>
<BlockId>14</BlockId>
</Send>
</Block>
<Block>
<BlockId>10</BlockId>
<Name>START VM4</Name>
<Type>Action</Type>
<TaskId>10</TaskId>
<Send />
</Block>
<Block>
<BlockId>12</BlockId>
<Name>SHUT</Name>
<Type>Action</Type>
<TaskId>12</TaskId>
<Send />
</Block>
</Blocks>
</Tests>
</Test>
我正在使用SAX来解析它。 一切正常,但每次我循环,我应该得到一个id为2的块然后另一个块与blockid 10然后12.然后我将添加到所有这些块进行测试。
我的代码部分是:
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
nqName = qName;
tag_name_List.setElementAt(nqName, level);
level = level + 1;
}
public void endElement(String uri, String localName,
String qName) throws SAXException {
level = level - 1;
tag_name_List.removeElementAt(level);
}
public void characters(char ch[], int start, int length) throws SAXException {
if (level != 0) {
////////////////Some code
} else if (level == 5
&& tag_name_List.elementAt(1).equals("Test")
&& tag_name_List.elementAt(2).equals("Blocks")
&& tag_name_List.elementAt(3).equals("Block")
&& (nqName.equalsIgnoreCase("BlockId"))) {
block = new Block();
test.addBlock(block);
block.setId(new String(ch, start, length));
block.setWorkflowId(workflow.getId());
} else if (level == 5 && ...) {
////// Code continues
NB这是一个巨大的xml和巨大的代码,所以只是部分共享......
但这里的问题是:
id
作为2
,"\n "
id
作为10
"\n "
id
12
"\n "
。我不确定为什么我会得到这些"\n "
。
我可以设置一个if
条件来避免该实体,但如果我这样做,我会丢失一些与id
相关联的信息,后来与"\n "
{{1}相关联}}
有没有人遇到过这种情况并且可以给出一个指针。
如果需要更多信息,请与我们联系。
在调试代码后我发现,它基本上从
结尾处取id
"\n "
由于此处的下一行会有<BlockId>14</BlockId>
和\r
。
我该如何避免这种情况?
答案 0 :(得分:0)
您指定nqName = qName
。你有没有改变这个值直到下一次迭代?
如果在离开BlockId
元素的上下文时没有更改该值,那么当外部时,仍然等于 BlockId
该元素,但尚未在Name
内,例如。 characters()
方法将读取所有它在那里找到的空白。
可能应该在nqName
中重置endElement()
。尝试添加
nqName = null;
到您的endElement()
方法。