我有一个正在尝试解析的 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 的 block ,然后是另一个 blockid 为 10 的 block ,然后是 12。然后我将所有这些 block 添加到测试中。
我的部分代码是:
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
注意这是一个巨大的 xml 和巨大的代码,所以只分享部分......
但这里的问题是:
- 第一次获得
id
为2
时, - 然后
“\n”
- 然后再次将
id
设置为10
- 然后
“\n”
- 然后
id
12
- 然后
“\n”
。
我不确定为什么会收到这些"\n "
。
我可以设置 if
条件来避免该实体,但如果这样做,我会丢失附加到该 id
的一些信息,这些信息稍后会与该 关联>“\n”
id
。
有没有人遇到过这个问题,可以指点一下。
如果需要更多信息,请告诉我。
调试代码后我发现,它基本上是从
末尾取出"\n "
<BlockId>14</BlockId>
因为这里的下一行将有 \r
和 "\n "
。
如何避免这种情况?
最佳答案
您分配nqName = qName
。在下一次迭代之前您是否会更改该值?
如果您在离开 BlockId
元素的上下文时不更改该值,则它仍然等于 BlockId
例如,您位于元素外部,但尚未位于Name
内部。 characters()
方法将读取它在那里找到的所有空白。
可能应该在 endElement()
中重置 nqName
。尝试添加
nqName = null;
到您的 endElement()
方法。
关于java - 使用 SAX 解析 XML 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23090850/