2014-10-22 9 views
2

Я разбираю некоторые HTML4 с помощью Groovy's XmlSlurper с поддержкой тегов Parser.Groovy XmlSlurper с TagSoup и неразрывными значениями пространства

Я получаю text() узла успешно, но пробелы HTML   затрудняют попытку проверить равенство с другим значением. В частности, .trim() фактически не обрезает строку всех пробелов. Мне кажется, что символы с обеих сторон значения - это пробелы (см. Код ниже), но String.trim() не обрезает, как я ожидал. Как видно из примера кода, Character.isSpaceChar() для первого символа в строке определяется как пробельный символ.

Почему String.trim() не обрезает это значение, которое я получил от XmlSlurper?

@Grab('org.ccil.cowan.tagsoup:tagsoup:1.2.1') 
import org.ccil.cowan.tagsoup.Parser 

def html = ''' 
<html> 
<body> 
<span id="interested">&nbsp;hello&nbsp;</span> 
</body> 
</html> 
''' 

def slurper = new XmlSlurper(new Parser()) 
def document = slurper.parseText(html) 

def value = document.'**'.find { it['@id'] == 'interested' }.text() 

println "value=[${value}]" 
println "first char isWhitespace? ${Character.isWhitespace(value.charAt(0))}" 
println "first char isSpaceChar? ${Character.isSpaceChar(value.charAt(0))}" 
assert 'hello' == value.trim() 

Урожайность:

value=[ hello ] 
first char isWhitespace? false 
first char isSpaceChar? true 
Exception thrown 

Assertion failed: 

assert 'hello' == value.trim() 
       | |  | 
       | |   hello  
       |  hello  
       false 

Я использую Groovy Version: 2.3.6 JVM: 1.8.0 Vendor: Oracle Corporation OS: Mac OS X

+0

В этом конкретном примере 'trim()' не удалял пробелы. – Opal

+0

Это как раз вопрос: почему он не обрезает пробел (или, по крайней мере, известный 'isSpaceChar()')? –

+1

вы также можете использовать '\ p {javaSpaceChar}' в regexp, чтобы избавиться от большого количества нежелательных нежелательных сообщений. – cfrick

ответ

2

Здесь Вы исправили пример:

@Grab('org.ccil.cowan.tagsoup:tagsoup:1.2.1') 
import org.ccil.cowan.tagsoup.Parser 

def html = ''' 
<html> 
<body> 
<span id="interested">&nbsp;hello&nbsp;</span> 
</body> 
</html> 
''' 

def slurper = new XmlSlurper(new Parser()) 
def document = slurper.parseText(html) 

def value = document.'**'.find { it['@id'] == 'interested' }.text() 

println "value=[${value}]" 
println "first char isWhitespace? ${Character.isWhitespace(value.charAt(0))}" 
println "first char isSpaceChar? ${Character.isSpaceChar(value.charAt(0))}" 
value = value.trim() 
println "first char isWhitespace? ${Character.isWhitespace(value.charAt(0))}" 
println "first char isSpaceChar? ${Character.isSpaceChar(value.charAt(0))}" 
assert 'hello' == value.replaceAll(String.valueOf((char) 160), " ").trim() 

И объяснение можно найти here (пробел против Непро- разрыв пространства).

+1

OK - спасибо. Я перечитываю [Character.isWhitespace()] (http://docs.oracle.com/javase/8/docs/api/java/lang/Character.html#isWhitespace-int-) javadocs - которые ясно объясняют что 'Символ является символом пробела Java тогда и только тогда, когда он удовлетворяет одному из следующих критериев: Это символ пробела в Юникоде (SPACE_SEPARATOR, LINE_SEPARATOR или PARAGRAPH_SEPARATOR), но также не является неразрывным ('\ u00A0' , '\ u2007', '\ u202F'). 'Я пропустил это. Благодаря! –

+0

Добро пожаловать. Пожалуйста, примите ответ, если ваша проблема решена;) Спасибо! – Opal