2008-10-22 23 views
12

ví dụ, tôi có tài liệu xml sau:Làm thế nào để chèn/di chuyển/xóa các nút trong xml bằng Groovy?

def CAR_RECORDS = ''' 
    <records> 
     <car name='HSV Maloo' make='Holden' year='2006'/> 
     <car name='P50' make='Peel' year='1962'/> 
     <car name='Royale' make='Bugatti' year='1931'/> 
    </records> 
    ''' 

và tôi muốn để di chuyển xe "Royale" lên đến đầu tiên, và chèn một chiếc xe mới ngay sau khi xe "HSV Maloo", kết quả sẽ be:

''' 
    <records> 
     <car name='Royale' make='Bugatti' year='1931'/> 
     <car name='HSV Maloo' make='Holden' year='2006'/> 
     <car name='My New Car' make='Peel' year='1962'/> 
     <car name='P50' make='Peel' year='1962'/> 
    </records> 
    ''' 

Làm thế nào để làm điều đó với Groovy? bình luận được chào đón.

Trả lời

12

Tôi đã đi xuống một tuyến đường tương tự để danb, nhưng chạy vào các vấn đề khi thực sự in ra XML kết quả. Sau đó, tôi nhận ra rằng NodeList đã được trả về bằng cách yêu cầu root cho tất cả những đứa trẻ "ô tô" không phải là danh sách giống như bạn nhận được chỉ bằng cách yêu cầu con của người chủ. Mặc dù chúng là những danh sách giống nhau trong trường hợp này, chúng sẽ không luôn luôn là nếu không có trẻ em "xe hơi" dưới gốc. Bởi vì điều này, việc sắp xếp lại danh sách những chiếc xe quay trở lại từ truy vấn không ảnh hưởng đến danh sách ban đầu.

Dưới đây là một giải pháp mà gắn thêm và sắp xếp lại:

def CAR_RECORDS = ''' 
    <records> 
    <car name='HSV Maloo' make='Holden' year='2006'/> 
    <car name='P50' make='Peel' year='1962'/> 
    <car name='Royale' make='Bugatti' year='1931'/> 
    </records> 
''' 

def carRecords = new XmlParser().parseText(CAR_RECORDS) 

def cars = carRecords.children() 
def royale = cars.find { [email protected] == 'Royale' } 
cars.remove(royale) 
cars.add(0, royale) 
def newCar = new Node(carRecords, 'car', [name:'My New Car', make:'Peel', year:'1962']) 

assert ["Royale", "HSV Maloo", "P50", "My New Car"] == carRecords.car*[email protected] 

new XmlNodePrinter().print(carRecords) 

Khẳng định với những chiếc xe propertly ra lệnh đi, và kết quả đầu ra XmlNodePrinter:

<records> 
    <car year="1931" make="Bugatti" name="Royale"/> 
    <car year="2006" make="Holden" name="HSV Maloo"/> 
    <car year="1962" make="Peel" name="P50"/> 
    <car name="My New Car" make="Peel" year="1962"/> 
</records> 
2

< tay sóng> đây không phải là codz bạn tìm kiếm </tay sóng>

Node root = new XmlParser().parseText(CAR_RECORDS) 
NodeList carNodes = root.car 
Node royale = carNodes[2] 
carNodes.remove(royale) 
carNodes.add(0, royale) 
carNodes.add(2, new Node(root, 'car', [name:'My New Card', make:'Peel', year:'1962'])) 

Tôi không biết nếu có một cách thông minh hơn để tạo ra các nút mới ... nhưng điều đó có hiệu quả đối với tôi.

EDIT: uhg ... cảm ơn các bạn ... Tôi đã lười biếng và đã in carNodes khi tôi thử nghiệm này thay vì gốc ... yikes.

+0

Xin chào, tôi cố gắng in bằng XmlNodePrinter, nhưng nó xuất hiện sai trật tự. flyisland

+0

Tôi vừa định nói điều tương tự ... có vẻ như sắp xếp lại các mục trong NodeList, nhưng điều đó không được phản ánh trong cách nút gốc được lặp đi lặp lại bởi XmlNodePrinter –

+0

yup ... Tôi đã rất cẩu thả, cảm ơn! – danb

5

ted, có thể bạn không để ý mà tôi muốn để '' 'chèn ô tô mới ngay sau ô tô "HSV Maloo"' '', vì vậy, tôi sửa đổi mã của bạn thành:

def newCar = new Node(null, 'car', [name:'My New Car', make:'Peel', year:'1962']) 
cars.add(2, newCar) 

new XmlNodePrinter().print(carRecords) 

bây giờ, nó hoạt động với thứ tự thích hợp! nhờ danb & ted.

<records> 
    <car year="1931" make="Bugatti" name="Royale"/> 
    <car year="2006" make="Holden" name="HSV Maloo"/> 
    <car name="My New Car" make="Peel" year="1962"/> 
    <car year="1962" make="Peel" name="P50"/> 
</records> 
+0

Vâng, tôi đã bỏ lỡ, oops :) Tôi đã nghĩ rằng bạn muốn nó cuối cùng, nhưng mã bạn có là chính xác để lấy nó ở vị trí thứ 3. –

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