2012-05-30 17 views
5

Sto perdendo uno spazio vuoto significativo da una pagina wiki che sto analizzando e penso che sia dovuto al parser. Ho questo nel mio script Groovy:XMLParser sta mangiando il mio spazio vuoto

@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] 
} 

Dove inputStream viene inizializzato da una richiesta GET URL per modificare una pagina wiki confluenza. Più tardi nel blocco withInputStream cui faccio questo:

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

noto tutto il contenuto originale della pagina è spogliato delle sue nuove righe. Inizialmente pensavo che fosse una cosa lato server, ma quando sono andato a fare lo stesso req nel mio browser e visualizzare la fonte, ho potuto vedere le nuove righe nel parametro nascosto "originalContent". C'è un modo semplice per disabilitare la normalizzazione degli spazi bianchi e preservare il contenuto del campo? Quanto sopra è stato eseguito su una pagina wiki interna di Confluence, ma molto probabilmente potrebbe essere rimossa durante la modifica di qualsiasi pagina wiki arbitraria.

Aggiornato sopra ho aggiunto un invito a "slurped.keepWhitespace = true", nel tentativo di preservare gli spazi bianchi, ma che ancora non funziona. Sto pensando che questo metodo è inteso per elementi e non attributi? C'è un modo per modificare facilmente i flag sul Java XMLParser sottostante? Esiste un'impostazione specifica per impostare gli spazi bianchi nei valori degli attributi?

+0

Questo è ciò che succede quando si mantenere i parser fame ;-) (mi dispiace, non ho potuto resistere) – dasblinkenlight

+0

Quindi se dici whitespache, vuoi dire solo a capo? E se dici che le parti di nuova riga non vengono rimosse, vengono solo convertite? Afaik XML ha solo linefeed per i newline. – blackdrag

+3

Credo che ci sia un problema a riguardo [nel Groovy JIRA] (http://jira.codehaus.org/browse/GROOVY-5360) –

risposta

1

Prima ho provato a riprodurre questo con una pagina di confluenza, ma non c'era nessun attributo di valore e nessun contenuto di testo nel nodo di input, quindi ho creato il mio test html.

Ora, ho pensato che il parser del tagoup avrebbe dovuto essere configurato per preservare anche gli spazi vuoti, solo l'impostazione di questo su slurper non sarebbe d'aiuto perché l'impostazione predefinita è ignorare gli spazi.

Così ho fatto solo questo, il tagsoup feature ignorable-whitespace è documentato btw. (cerca spazi bianchi nella pagina)

In ogni caso, non funziona. Gli spazi bianchi dagli attributi vengono preservati come puoi vedere dall'esempio e preservare gli spazi bianchi del testo non sembra funzionare nonostante l'impostazione della funzione extra. Forse questo è un bug in tagoup o lo slurper xml?

Ti suggerisco di dare un'occhiata più da vicino al tuo codice HTML, è presente un attributo di valore?

@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

Grazie per aver elaborato questo. Includo una versione modificata del tuo script in alcuni per evidenziare meglio il mio problema. – Cliff

+0

Hai ragione. Ho cercato su Google ancora di più e sembra che semplicemente non funzioni.Mentre le newline sono consentite negli attributi, vengono normalizzate. Ma qui è una soluzione delineata: http://stackoverflow.com/questions/2746876/xml-parsing-in-groovy-strips-attribute-new-lines – stackmagic

0

Sembra che le nuove righe non vengano mantenute nell'attributo valore. Vedi sotto:

@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" 
} 
Problemi correlati