Java 具有TagSoup和非中断空格值的Groovy XmlSlurper

Java 具有TagSoup和非中断空格值的Groovy XmlSlurper,java,string,groovy,xmlslurper,tag-soup,Java,String,Groovy,Xmlslurper,Tag Soup,我正在用Groovy的XmlSlurper解析一些HTML4,它由一个tagsoup解析器支持 我正在成功地获取节点的text(),但是HTML空格在尝试测试是否与另一个值相等时给了我一些困难。具体来说,.trim()实际上并不修剪所有空白字符串。在我看来,值两边的字符都是空白(请参见下面的代码),但是String.trim()并没有按照我所期望的方式进行修剪。从代码示例可以看出,字符串中第一个字符的Character.isSpaceChar()被确定为空格字符 为什么String.trim()

我正在用Groovy的
XmlSlurper
解析一些HTML4,它由一个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()

我使用的是
Groovy版本:2.3.6 JVM:1.8.0供应商:Oracle公司OS:Mac OS X

这里您已经更正了示例:

@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()
@Grab('org.ccil.cowan.tagsoup:tagsoup:1.2.1')
导入org.ccil.cowan.tagsoup.Parser
def html=''
你好
'''
def slurper=new XmlSlurper(new Parser())
def document=slurper.parseText(html)
def value=document.'**'。查找{it['@id']=='interest'}.text()
println“值=[${value}]”
println“第一个字符是空格?${Character.isWhitespace(value.charAt(0))}”
println“第一个字符isSpaceChar?${Character.isSpaceChar(value.charAt(0))}”
value=value.trim()
println“第一个字符是空格?${Character.isWhitespace(value.charAt(0))}”
println“第一个字符isSpaceChar?${Character.isSpaceChar(value.charAt(0))}”
断言'hello'==value.replaceAll(String.valueOf((char)160),“”)。trim()

可以找到解释(空格与不间断空格)。

在这个特定示例中,
trim()
没有删除空格。这正是问题所在-为什么不修剪空格(或者至少是已知的
isSpaceChar()
)?您也可以使用
\p{javaSpaceChar}
在regexp中清除大量的白色垃圾。好的-谢谢。我正在重读javadocs,它清楚地解释了
字符是Java空白字符,当且仅当它满足以下条件之一时:它是Unicode空格字符(空格分隔符、行分隔符或段落分隔符),但也不是不间断的空格('\u00A0'、'\u2007'、'\u202F')。
我错过了这一点。谢谢不客气。如果您的问题得到解决,请接受答案;)谢谢
@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()