2012-05-30 37 views
5

Tôi đang mất khoảng trống đáng kể từ trang wiki tôi đang phân tích cú pháp và tôi nghĩ đó là do trình phân tích cú pháp. Tôi có điều này trong tập lệnh Groovy của tôi:XMLParser đang ăn khoảng trắng của tôi

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

Nơi inputStream được khởi tạo từ URL GET yêu cầu chỉnh sửa trang wiki hợp lưu. Sau đó trong khối withInputStream nơi tôi làm điều này:

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

Tôi nhận thấy tất cả các nội dung ban đầu của trang được tước dòng mới của nó. Ban đầu tôi nghĩ rằng đó là một điều phía máy chủ nhưng khi tôi đã thực hiện cùng một req trong trình duyệt của tôi và xem nguồn tôi có thể thấy dòng mới trong tham số ẩn "originalContent". Có cách nào dễ dàng để vô hiệu hóa bình thường khoảng trắng và giữ lại nội dung của trường? Ở trên đã được chạy trên một trang wiki Confluence nội bộ nhưng rất có thể sẽ bị reproved khi chỉnh sửa bất kỳ trang wiki tùy ý nào.

Đã cập nhật ở trên Tôi đã thêm lệnh gọi "slurped.keepWhitespace = true" trong nỗ lực bảo vệ khoảng trắng nhưng vẫn không hoạt động. Tôi nghĩ phương pháp này là dành cho các yếu tố và không thuộc tính? Có cách nào để dễ dàng tinh chỉnh cờ trên Java XMLParser cơ bản không? Có một cài đặt cụ thể nào để đặt cho khoảng trắng trong các giá trị thuộc tính không?

+0

Đó là những gì sẽ xảy ra khi bạn tiếp tục phân tích cú pháp của bạn đói ;-) (Tôi xin lỗi, tôi không thể cưỡng lại) – dasblinkenlight

+0

Vì vậy, nếu bạn nói whitespache, bạn có nghĩa là chỉ có dòng mới? Và nếu bạn nói các phần dòng mới không bị xóa, chúng chỉ được chuyển đổi? Afaik XML chỉ có linefeed cho dòng mới. – blackdrag

+3

Tôi tin rằng có một vấn đề về điều này [trong Groovy JIRA] (http://jira.codehaus.org/browse/GROOVY-5360) –

Trả lời

1

Lần đầu tiên tôi cố gắng tạo lại điều này với một số trang hợp lưu của riêng tôi, nhưng không có thuộc tính giá trị và không có nội dung văn bản trong nút đầu vào, vì vậy tôi đã tạo html thử nghiệm của riêng mình.

Bây giờ, tôi đã tìm ra trình phân tích cú pháp thẻ cần phải được định cấu hình để giữ khoảng trắng, chỉ việc thiết lập điều này trên slurper sẽ không giúp vì mặc định là bỏ qua khoảng trắng.

Vì vậy, tôi đã thực hiện chỉ điều này, tagsoup feature ignorable-whitespace là tài liệu btw. (tìm kiếm khoảng trắng trên trang)

Dù sao, nó không hoạt động. Khoảng trống từ các thuộc tính được giữ nguyên như bạn có thể thấy từ ví dụ và bảo toàn khoảng trắng văn bản dường như không hoạt động mặc dù đã thiết lập tính năng bổ sung. Có lẽ đây là một lỗi trong tagoup hoặc xml slurper?

Tôi đề nghị bạn cũng nên xem xét kỹ hơn html của mình, có thực sự là thuộc tính giá trị hiện tại không?

@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

Cảm ơn bạn đã xây dựng điều này. Tôi đang bao gồm một phiên bản sửa đổi của kịch bản của bạn trong một vài để làm nổi bật vấn đề của tôi tốt hơn. – Cliff

+0

Bạn nói đúng. Tôi googled một số chi tiết và có vẻ như điều này chỉ đơn giản là không hoạt động.Trong khi các dòng mới được cho phép trong các thuộc tính chúng được chuẩn hóa. Nhưng đây là giải pháp được giải thích: http://stackoverflow.com/questions/2746876/xml-parsing-in-groovy-strips-attribute-new-lines – stackmagic

0

Dường như các dòng mới không được giữ nguyên trong thuộc tính giá trị. Xem dưới đây:

@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" 
} 
Các vấn đề liên quan