java - 使用 SAX 解析 XML 时出现问题

标签 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 的 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 和巨大的代码,所以只分享部分......

但这里的问题是:

  • 第一次获得id2时,
  • 然后“\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/

相关文章:

java - 一个最小的 Java 程序应该是什么样子的?

java - @Transactional 注解的替代方案

java - 使用快速数据顺序错误进行mapreduce

android - 长时间运行的 XML 解析方法中的奇怪行为

java - docx4j - 从 xml 文件加载部分

java - 如何检测 Java 中 if else 语句中的所有特殊字符?

c# - 为大型 XML 文件生成数字 XML 签名

xml - Scala XML 模式匹配和属性

xml - 通过 XSLT 使用 CDATA 部分包围 XML 元素

javascript XMLSerializer 属性中的特殊字符