使用SAX进行XML解析的问题

时间:2014-04-15 17:46:59

标签: java xml xml-parsing saxparser

我有一个我想解析的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

我该如何避免这种情况?

1 个答案:

答案 0 :(得分:0)

您指定nqName = qName。你有没有改变这个值直到下一次迭代?

如果在离开BlockId元素的上下文时没有更改该值,那么当外部时,仍然等于 BlockId 该元素,但尚未在Name内,例如。 characters()方法将读取所有它在那里找到的空白。

可能应该在nqName中重置endElement()。尝试添加

nqName = null;

到您的endElement()方法。