2013-10-06 2 views
2

У меня есть следующие XML file.Why пробелы приходят в characters() даже после применения ValidationУдаление пробельных символов в SAX Parser

<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; 
     } 
    } 

} 

Желаемая Ouput:

James 
11 

Фактический выход:

James 

11 

Почему пространства АРЕС приходит на выходе?

ответ

0

Если вы используете validating parser он сообщит игнорируемые пропуски через ignorableWhitespace() метод вместо characters().

В противном случае анализатор имеет полное право дать вам пробельные через characters(). См Javadoc.

+0

Это не даст мне текст между тегами. – Sanjana

+1

@downvoter Пожалуйста, объясните. – EJP

+0

@Sanjana Я не понимаю ваш комментарий. Пожалуйста, объясни. – EJP

2

Фактическое значение строки из текстового узла, который является потомком <Name> тега

\nJames\n 

Аналогично, значение строки текстового узла в <Id> является

\n11\n 

где \n представляет символ новой строки. Ни одна из новых строк не является неосведомленным пробелом. Если вы хотите их удалить, вы должны сделать это самостоятельно, в своем Java-коде.

1

Вы можете удалить пробелы для вас, если вы поместите XML через механизм проверки схемы (XSD) и объявите типы имен и идентификаторов типом, который разрушает все пробелы, например. тип xs: токен. Валидатор DTD никогда не будет делать это для текстовых узлов (только для узлов атрибутов).

Смежные вопросы