2012-05-30 13 views
5

Ich verliere signifikante Leerzeichen von einer Wiki-Seite, die ich analysiere, und ich denke, dass es wegen des Parsers ist. Ich habe dies in meinem Groovy Skript:XMLParser isst meine Leerzeichen

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

Wo input von einer URL-GET-Anfrage initialisiert wird eine Zusammenfluß Wiki-Seite zu bearbeiten. Später im withInputStream Block, wo ich dies tun:

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

Ich bemerke, alle ursprünglichen Inhalt der Seite seiner newlines abgezogen wird. Ich dachte ursprünglich, dass es eine serverseitige Sache ist, aber als ich ging, um die gleiche req in meinem Browser zu machen und Quelle zu sehen, konnte ich neue Zeilen im versteckten Parameter "originalContent" sehen. Gibt es eine einfache Möglichkeit, die Whitespace-Normalisierung zu deaktivieren und den Inhalt des Feldes zu erhalten? Das oben genannte wurde gegen eine interne Confluence-Wiki-Seite ausgeführt, könnte jedoch am ehesten beim Bearbeiten einer beliebigen Wiki-Seite korrigiert werden.

Aktualisiert oben ich einen Anruf auf „slurped.keepWhitespace = true“ in einem Versuch, Leerzeichen zu erhalten hinzugefügt, aber das immer noch nicht funktioniert. Ich denke diese Methode ist für Elemente und nicht für Attribute gedacht? Gibt es eine Möglichkeit, Flags auf dem zugrunde liegenden Java XMLParser einfach zu optimieren? Gibt es eine spezielle Einstellung für Leerzeichen in Attributwerten?

+0

Das ist, was passiert, wenn Sie Ihre Parser halten hungrig ;-) (Es tut mir leid, ich konnte nicht widerstehen) – dasblinkenlight

+0

Also, wenn Sie whitespache sagen, meinen Sie nur Zeilenumbrüche? Und wenn Sie sagen, dass die Newline-Teile nicht entfernt werden, werden sie nur konvertiert? Afaik XML hat nur Zeilenumbrüche für Zeilenumbrüche. – blackdrag

+3

Ich glaube, es gibt ein Problem [in der Groovy JIRA] (http://jira.codehaus.org/browse/GROOVY-5360) –

Antwort

1

Zuerst habe ich versucht, dies mit einer eigenen Confluence-Seite zu reproduzieren, aber es gab kein Wertattribut und keinen Textinhalt im Eingabeknoten, also habe ich meinen eigenen Testhtml erstellt.

Nun, ich dachte, dass der Tagsoup-Parser konfiguriert werden müsste, um auch Leerräume zu erhalten, nur das Einstellen auf den Slurper wird nicht helfen, da der Standard ist, Whitespace zu ignorieren.

Also ich habe gerade das gemacht, die tagsoup feature ignorable-whitespace ist übrigens dokumentiert. (Suche nach Leerzeichen auf der Seite)

Wie auch immer, es funktioniert nicht. Whitespace von Attributen wird beibehalten, wie Sie aus dem Beispiel sehen können, und das Beibehalten von Text-Whitespaces scheint trotz der Einstellung der Extra-Funktion nicht zu funktionieren. Vielleicht ist das ein Fehler in Tagsoup oder dem XML-Slurper?

Ich schlage vor, dass Sie sich auch Ihren HTML-Code genauer ansehen, gibt es wirklich ein Value-Attribut?

@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

Danke für die Ausarbeitung. Ich füge eine modifizierte Version Ihres Skripts in ein paar ein, um mein Problem besser hervorzuheben. – Cliff

+0

Sie haben Recht. Ich habe mehr gegoogelt und es scheint, dass das einfach nicht funktioniert.Während neue Zeilen in Attributen erlaubt sind, sind sie normalisiert. Aber hier ist ein Workaround: http://stackoverflow.com/questions/2746876/xml-parsing-in-groovy-strips-attribute-new-lines – stackmagic

0

Es scheint, dass die Zeilenumbrüche nicht im Attribut value beibehalten werden. Siehe unten:

@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" 
} 
Verwandte Themen