2012-05-30 12 views
5

Estoy perdiendo espacios en blanco significativos de una página wiki que estoy analizando y estoy pensando que es por el analizador sintáctico. Tengo esto en mi guión maravilloso:XMLParser está comiendo mi espacio en blanco

@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2') 
def slurper = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser()) 
slurper.keepWhitespace = true 
inputStream.withStream{ doc = slurper.parse(it) 
println "originalContent = " + doc.'**'.find{ [email protected] == 'editpageform' }.'**'.find { [email protected]=='originalContent'}[email protected] 
} 

Dónde flujoEntrada se inicia a partir de una solicitud de URL GET para editar una página wiki de confluencia. Más tarde, en el bloque withInputStream donde hago esto:

println "originalContent = " + doc.'**'.find{ [email protected] == 'editpageform' }.'**'.find { [email protected]=='originalContent'}[email protected] 

Me he dado cuenta de todo el contenido original de la página es despojado de sus nuevas líneas. Originalmente pensé que era algo del lado del servidor, pero cuando fui a hacer la misma solicitud en mi navegador y ver fuente, pude ver nuevas líneas en el parámetro oculto "originalContent". ¿Hay alguna manera fácil de desactivar la normalización del espacio en blanco y conservar el contenido del campo? Lo anterior se ejecutó contra una página wiki interna de Confluence, pero es muy probable que se reproduzca al editar cualquier página wiki arbitraria.

Actualizado por encima de que añade una llamada a "slurped.keepWhitespace = true" en un intento de preservar los espacios en blanco, pero que todavía no funciona. Estoy pensando que este método está destinado a elementos y no a atributos. ¿Hay alguna manera de modificar fácilmente las banderas en Java XMLParser subyacente? ¿Hay una configuración específica para establecer espacios en blanco en los valores de los atributos?

+0

Eso es lo que sucede cuando usted mantiene sus analizadores hambre ;-) (lo siento, no pude resistir) – dasblinkenlight

+0

Así que si usted dice whitespache, que significa sólo saltos de línea? Y si dice que las partes nuevas no se eliminan, ¿solo se convierten? Afaik XML solo tiene linefeed para nuevas líneas. – blackdrag

+3

Creo que hay un problema sobre esto [en Groovy JIRA] (http://jira.codehaus.org/browse/GROOVY-5360) –

Respuesta

1

Intenté por primera vez reproducir esto con alguna página de confluencia, pero no había ningún atributo de valor ni contenido de texto en el nodo de entrada, así que creé mi propia prueba html.

Ahora, calculé que el analizador de etiqueta tendría que configurarse para preservar los espacios en blanco también, simplemente configurar esto en la tragamonedas no ayudará porque el valor predeterminado es ignorar los espacios en blanco.

Así que he hecho esto, el tagsoup feature ignorable-whitespace está documentado por cierto. (busque espacios en blanco en la página)

De todos modos, no funciona. El espacio en blanco de los atributos se conserva como se puede ver en el ejemplo y la preservación del espacio en blanco no parece funcionar a pesar de establecer la función adicional. Tal vez esto es un error en la etiqueta o la xml slurper?

Le sugiero que también eche un vistazo a su html, ¿existe realmente un atributo de valor presente?

@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2') 

String html = """\ 
<html><head><title>test</title></head><body> 
<p> 
    <form id="editpageform"> 
     <p> 
      <input name="originalContent" value="   ">   

      </input> 
     </p> 
    </form> 
</p> 
</body></html> 
""" 
def inputStream = new ByteArrayInputStream(html.getBytes()) 

def parser = new org.ccil.cowan.tagsoup.Parser() 
parser.setFeature("http://www.ccil.org/~cowan/tagsoup/features/ignorable-whitespace", true) 

def slurper = new XmlSlurper(parser) 
slurper.keepWhitespace = true 

inputStream.withStream{ doc = slurper.parse(it) 
    def parse = { doc.'**'.find{ [email protected] == 'editpageform' }.'**'.find { [email protected]=='originalContent'} } 
    println "originalContent (name) = '${parse()[email protected]}'" 
    println "originalContent (value) = '${parse()[email protected]}'" 
    println "originalContent (text) = '${parse().text()}'" 
} 
+0

Gracias por profundizar en esto. Incluyo una versión modificada de tu script en unos pocos para resaltar mejor mi problema. – Cliff

+0

Tienes razón. Busqué en Google un poco más y parece que esto simplemente no funciona.Si bien las nuevas líneas están permitidas en los atributos, están normalizadas. Pero aquí hay una solución resumida: http://stackoverflow.com/questions/2746876/xml-parsing-in-groovy-strips-attribute-new -lines – stackmagic

0

Parece que las nuevas líneas no se conservan en el atributo de valor. Vea a continuación:

@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2') 

String html = """\ 
<html><head><title>test</title></head><body> 
<p> 
    <form id="editpageform"> 
     <p> 
      <input name="originalContent" value=" 



        ">   

      </input> 
     </p> 
    </form> 
</p> 
</body></html> 
""" 
def inputStream = new ByteArrayInputStream(html.getBytes()) 

def parser = new org.ccil.cowan.tagsoup.Parser() 
parser.setFeature("http://www.ccil.org/~cowan/tagsoup/features/ignorable-whitespace", true) 

def slurper = new XmlSlurper(parser) 
slurper.keepWhitespace = true 

inputStream.withStream{ doc = slurper.parse(it) 
    def parse = { doc.'**'.find{ [email protected] == 'editpageform' }.'**'.find { [email protected]=='originalContent'} } 
    println "originalContent (name) = '${parse()[email protected]}'" 
    println "originalContent (value) = '${parse()[email protected]}'" 
    println "originalContent (text) = '${parse().text()}'" 
    assert parse()[email protected]().contains('\n') : "Should contain a newline" 
} 
Cuestiones relacionadas