5

解析しているwikiページからかなりの空白が失われていますが、これはパーサーが原因だと思います。Groovyスクリプトにこれがあります:

@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{ it.@id == 'editpageform' }.'**'.find { it.@name=='originalContent'}.@value
}

inputStreamがURLGETリクエストから初期化され、ConfluenceWikiページを編集する場合。後でこれを行うwithInputStreamブロックで:

println "originalContent = " + doc.'**'.find{ it.@id == 'editpageform' }.'**'.find { it.@name=='originalContent'}.@value

ページの元のコンテンツがすべて改行されていないことに気付きました。もともとはサーバー側のものだと思っていましたが、ブラウザとビューソースで同じリクエストを作成すると、「originalContent」の非表示パラメータに改行が表示されました。空白の正規化を無効にしてフィールドの内容を保持する簡単な方法はありますか?上記は、内部のConfluence wikiページに対して実行されましたが、任意のwikiページを編集するときにおそらく非難される可能性があります。

上記で更新 した空白を保持するために「slurped.keepWhitespace=true」の呼び出しを追加しましたが、それでも機能しません。このメソッドは属性ではなく要素を対象としていると思いますか?基盤となるJavaXMLParserのフラグを簡単に微調整する方法はありますか?属性値の空白に設定する特定の設定はありますか?

4

2 に答える 2

1

最初に自分の合流ページでこれを再現しようとしましたが、入力ノードに値属性もテキスト コンテンツもなかったので、独自のテスト html を作成しました。

ここで、tagsoup パーサーも空白を保持するように構成する必要があると考えました。デフォルトでは空白を無視するため、スラーパーでこれを設定するだけでは役に立ちません。

だから私はこれをやった.tagsoup機能のignorable-whitespaceは文書化されている. (ページ内の空白を検索)

とにかく、うまくいきません。例からわかるように、属性の空白は保持され、テキストの空白の保持は、追加機能を設定しても機能しないようです。これは、tagsoup または xml slurper のバグでしょうか?

あなたのhtmlもよく見てみることをお勧めします。実際に値属性が存在しますか?

@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{ it.@id == 'editpageform' }.'**'.find { it.@name=='originalContent'} }
    println "originalContent (name)  = '${parse().@name}'"
    println "originalContent (value) = '${parse().@value}'"
    println "originalContent (text)  = '${parse().text()}'"
}
于 2012-06-08T16:17:47.417 に答える
0

value 属性に改行が保持されていないようです。下記参照:

@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{ it.@id == 'editpageform' }.'**'.find { it.@name=='originalContent'} }
    println "originalContent (name)  = '${parse().@name}'"
    println "originalContent (value) = '${parse().@value}'"
    println "originalContent (text)  = '${parse().text()}'"
    assert parse().@value.toString().contains('\n') : "Should contain a newline"
}
于 2012-06-08T17:45:02.807 に答える