2012-03-06 32 views
7

Tôi đang viết một vài tập lệnh chỉnh sửa tệp xml. Các tệp được đề cập sử dụng phần tử xml: lang. Groovy (XmlSlurper) dường như đang chèn một không gian tên tag0, mà tôi sẽ không bận tâm quá nhiều, ngoại trừ nó dường như phá vỡ quá trình xử lý sau với XmlUtil.XML Groovy và không gian tên "xml:"

Một ví dụ:

import groovy.xml.StreamingMarkupBuilder 
import groovy.xml.XmlUtil 

String source = """<?xml version='1.0' encoding='UTF-8'?> 
<root> 
    <one xml:lang="en">First</one> 
    <one xml:lang="de">Second</one> 
</root> 
""" 

def root = new XmlSlurper().parseText(source).declareNamespace(xml: "http://www.w3.org/XML/1998/namespace") 
println root 
String xml = new StreamingMarkupBuilder().bind{ 
    mkp.xmlDeclaration() 
    out << root 
} 
println xml 
println XmlUtil.serialize(xml) 

kết quả trong

[Fatal Error] :2:44: The value of the attribute "prefix="xmlns",localpart="tag0",rawname="xmlns:tag0"" is invalid. Prefixed namespace bindings may not be empty. 

Các xml: namespace là nghĩa vụ phải tồn tại theo mặc định, và tôi đã cố gắng thêm nó với .declareNamespace() nhưng nó doesn' t dường như giúp đỡ. Tôi cảm thấy như tôi đang thiếu một cái gì đó hiển nhiên, nhưng Google đã không thể cho tôi biết nó là gì.

Trả lời

8

Tìm thấy this thread từ một vài năm trước đây, mà nói:

Vấn đề là tài liệu gốc sử dụng không gian tên mặc định.

SMB thường không sử dụng không gian tên mặc định để nó phát ra thẻ và sử dụng nó để đánh dấu rõ ràng từng phần tử trong không gian tên. Theo như một trình phân tích cú pháp XML có liên quan, nó không quan trọng như thế nào không gian tên được chỉ định. Tuy nhiên có những lý do thẩm mỹ tại sao đôi khi nó được mong muốn sử dụng các không gian tên mặc định.

Nếu bạn đặt mkp.declareNamespace("": "http://java.sun.com/xml/ns/j2ee") làm dòng đầu tiên trong công cụ đóng xây dựng, bạn sẽ nhận được kết quả mong muốn.

Tuy nhiên, điều này dường như không làm việc

Giải pháp duy nhất tôi đã tìm thấy là làm cho slurper bỏ qua không gian tên và xác nhận;

def root = new XmlSlurper(false,false).parseText(source) 
+0

Đáng tiếc là nó không có hiệu lực thi hành mà đối với tôi. Tôi nhận được lỗi chính xác giống như trước đây. Tôi đang trong groovy 1.8.6, còn bạn thì sao? –

+0

Chỉ cần kiểm tra lại, và bạn nói đúng ... Xin lỗi ... Tôi sẽ gỡ bỏ điều này, và có một đi xem nếu tôi có thể làm việc ... –

+0

@ErikAckerman Cập nhật câu trả lời của tôi để hiển thị giải pháp duy nhất tôi đã tìm thấy –

2

Đặt không gian tên mặc định thành thẻ trống hoạt động cho tôi (không thêm "tag0"). tôi sử dụng constructor XmlSlurper mặc định để có không gian tên làm việc và xác nhận, ví dụ:

def root = new XmlSlurper().parseText(source).declareNamespace(xml: "http://www.w3.org/XML/1998/namespace") 

Khi ràng buộc, tuyên bố namespace trống:

def writer = new StreamingMarkupBuilder().bind { 
    mkp.declareNamespace("": "") //get rid of "tag0" 
    mkp.declareNamespace(xml: "http://www.w3.org/XML/1998/namespace") 
    mkp.yield root 
} 
Các vấn đề liên quan