2012-02-08 25 views
10

Tôi đang cố phân tích cú pháp và sửa đổi tệp pom.xml của Maven bằng XmlSlurper của Groovy. Pom.xml của tôi khai báo không gian tên xsi.không gian tên tag0 được thêm vào cho các phần tử trong không gian tên mặc định

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>a-group-id</groupId> 
<artifactId>an-artifact-id</artifactId> 

nguồn Groovy của tôi là như sau:

import groovy.xml.XmlUtil 
def pom = new XmlSlurper().parse('pom.xml') 
    .declareNamespace('': 'http://maven.apache.org/POM/4.0.0', 
     xsi: 'http://www.w3.org/2001/XMLSchema-instance') 
//manipulate the pom 
println XmlUtil.serialize(pom) 

Như bạn thấy, tôi đã tuyên bố không gian tên đầu tiên như trống rỗng. Tuy nhiên trong tag0 đầu ra được thêm vào ở khắp mọi nơi.

<?xml version="1.0" encoding="UTF-8"?> 
<tag0:project xmlns:tag0="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
     http://maven.apache.org/maven-v4_0_0.xsd"> 
<tag0:modelVersion>4.0.0</tag0:modelVersion> 
<tag0:groupId>a-group-id</tag0:groupId> 
<tag0:artifactId>an-artifact-id</tag0:artifactId> 

Làm cách nào để tránh điều đó?

Đối với thời điểm này workaround của tôi là loại bỏ các thẻ bằng tay:

println XmlUtil.serialize(pom).replaceAll('tag0:', '').replaceAll(':tag0', '') 
+1

Việc xây dựng 'XmlSlurper' không có hỗ trợ không gian tên có đủ không? tức là: 'println XmlUtil.serialize (new XmlSlurper (false, false) .parse ('pom.xml'))'? –

+0

wow, vâng, thế là đủ rồi, cảm ơn Tim. bạn có thể cung cấp nó như là một câu trả lời? Ngoài ra tôi đã nhận thấy rằng tất cả các ý kiến ​​trong XML bị mất, bạn có biết cách giải quyết nào cho nó không? BTW, đây là hai tiện ích tôi đã viết [pomRm] (http://www.stefanolocati.it/blog/?p=1226) và [pomVersions] (http://www.stefanolocati.it/blog/?p= 1220). – stivlo

+0

Không thể xem cách giữ bình luận tại thời điểm này ... :-(Tôi sẽ nghĩ nếu tôi có một khoảnh khắc miễn phí chiều nay ... –

Trả lời

16

Bạn có thể xây dựng các XmlSlurper không có namespace awareness như vậy:

import groovy.xml.XmlUtil 

def pom = new XmlSlurper(false, false).parse('pom.xml') 
println XmlUtil.serialize(pom) 

nào sẽ cho bạn câu trả lời bạn muốn .. Hiện tại, không có ý tưởng về cách duy trì nhận xét trong chu kỳ slurp/serialize :-(

Như bạn nói, nó có thể thực hiện được với XmlParser, nhưng những nỗ lực hiện tại của tôi đã thất bại :-(Có some code herethể giúp bạn đóng, nhưng tôi còn chưa chuẩn đã không thành công :-(

+0

Cảm ơn bạn Tim, điều này làm việc, cho các vấn đề ý kiến ​​tôi sẽ cố gắng vào cuối tuần. – stivlo

+0

CommentCollectingParser hoạt động để tìm các nhận xét trước một nút, ví dụ: để in nhận xét: * def parser = new CommentCollectingParser(); def root = parser.parse (tệp mới ('plan.xml')); println parser.commentsFor (root.week [0]); * Tuy nhiên, nếu tôi cố gắng in toàn bộ XML, chúng không được bao gồm. * def writer = new StringWriter(); new XmlNodePrinter (new PrintWriter (writer)). in (gốc); println writer.toString(); * Trong [XmlParser JavaDoc] (http://groovy.codehaus.org/api/groovy/util/XmlParser.html), trên thực tế, họ nói: * Trình phân tích cú pháp này bỏ qua các nhận xét và hướng dẫn xử lý * – stivlo

+0

Công việc của tôi cũng vậy. – Pushkar

1

tôi thấy rằng nó là tốt hơn để sử dụng chứ không phải là XmlParser XmlSlurper nếu bạn đang xử lý các không gian tên và gặp vấn đề về tag0. Về mặt cú pháp, chúng có vẻ giống nhau, ví dụ:

def root = new XmlParser().parse(new File('example.xml')) 
println XmlUtil.serialize(root) 

Đoạn mã trên sẽ xuất ra ví dụ chính xác như cần bao gồm cả không gian tên.

Nếu bạn muốn xử lý gốc rễ một cách nào đó, ví dụ như tìm thấy một nút cụ thể, sử dụng API Groovy và đầu ra kết quả, ví dụ như

def root = new XmlParser().parse(new File('example.xml') 
def result = root."ns:Element"[0] 
println XmlUtil.serialize(result) 
3

tôi đã cùng một vấn đề với "tag0" việc bổ sung vào các yếu tố không xác định một không gian tên (nghĩa là chúng nằm trong không gian tên "không có không gian tên"). Tôi cố định này bằng cách thêm

declareNamespace('': '') 

mà resets các yếu tố từ là trong không gian tên mặc định là trong "không gian tên" namespace.

Các vấn đề liên quan