在SAX解析器

问题描述:

删除空白,我有以下XML file.Why空格在characters()即使在应用验证在SAX解析器

<Employee> 
<Name> 
James 
</Name> 
<Id> 
11 
</Id> 
</Employee> 

我想在标签之间显示文本后到来。

public class MyHandler extends DefaultHandler { 

    boolean isName = false; 
    boolean isId = false; 

    @Override 
    public void characters(char[] arg0, int arg1, int arg2) throws SAXException { 
     if (isName) { 
      System.out.println(new String(arg0, arg1, arg2)); 
      isName = false; 
     } 
     if (isId) { 
      System.out.println(new String(arg0, arg1, arg2)); 
      isId = false; 
     } 
    } 

    @Override 
    public void startElement(String arg0, String arg1, String arg2, 
      Attributes arg3) throws SAXException {   
     if (arg2.equalsIgnoreCase("Name")) { 
      isName = true; 
     } 
     if (arg2.equalsIgnoreCase("Id")) { 
      isId = true; 
     } 
    } 

} 

期望输出继电器:

James 
11 

实际输出:

James 

11 

为什么空间战神在输出来吗?

如果使用validating parser它将通过ignorableWhitespace()方法,而不是characters().

否则解析器完全有权给你空白通过characters().Javadoc报告忽略的空白。

+0

它不会给我在标签之间的文字。 – Sanjana

+1

@downvoter请解释。 – EJP

+0

@Sanjana我不明白你的评论。请解释。 – EJP

文本节点的实际字符串值,是<Name>标签的孩子

\nJames\n 

同样,文本节点在<Id>字符串值

\n11\n 

其中\n代表换行符。没有任何新行可以忽略空格。如果你想删除它们,你必须在Java代码中自己做。

如果您通过模式(XSD)验证程序放入XML并使用折叠所有空格的类型声明Name和Id的类型,则可以为您删除空白字符。键入xs:token。 DTD验证器不会为文本节点执行此操作(仅限于属性节点)。