2014-10-22 5 views
2

Groovy의 XmlSlurper 태그가있는 HTML4를 구문 분석합니다. 태그 수는 Parser입니다.Groovy XmlSlurper TagSoup 및 비 분리 공백 값

노드의 text()이 성공적으로 표시되지만   공백은 다른 값과 동일한 지 테스트하려고 할 때 약간의 어려움을줍니다. 특히 .trim()은 실제로 모든 공백의 문자열을 자르지 않습니다. 값의 양쪽에있는 문자가 공백 (아래 코드 참조)이지만 String.trim()은 내가 기대하는 방식을 다듬지 않는 것으로 보입니다. 코드 샘플에서 볼 수 있듯이 문자열의 첫 번째 문자에 대한 Character.isSpaceChar()은 공백 문자로 결정됩니다.

XmlSlurper에서 얻은이 값을 String.trim()이 트리밍하지 않는 이유는 무엇입니까?

@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}'를 사용하여 많은 공백 쓰레기를 제거 할 수 있습니다. – 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를 다시 읽고있다. 'A 문자는 다음 기준 중 하나를 만족하는 경우에만 Java 공백 문자입니다. 유니 코드 공백 문자 (SPACE_SEPARATOR, LINE_SOPARATOR 또는 PARAGRAPH_SEPARATOR)이지만 줄 바꿈하지 않는 공백 ('\ u00A0' , '\ u2007', '\ u202F'). "나는 그것을 놓쳤다. 감사! –

+0

반갑습니다. 문제가 해결되면 답변을 수락하십시오;) 감사합니다! – Opal