2013-01-10 41 views
5

Hãy xem xét các tài liệu XML sau đây:removeChild(): làm thế nào để loại bỏ thụt lề quá?

<items> 
    <item>item1</item> 
    <item>item2</item> 
</items> 

Bây giờ, chúng ta hãy loại bỏ tất cả các mục và thêm một số item mới. Mã số:

//-- assume we have Element instance of <items> element: items_parent 
    // and the Document instance: doc 

    //-- remove all the items 
    NodeList items = items_parent.getElementsByTagName("item"); 

    for (int i = 0; i < items.getLength(); i++){ 
    Element curElement = (Element)items.item(i); 
    items_parent.removeChild(curElement); 
    } 

    //-- add a new one 
    Element new_item = doc.createElement("item"); 
    new_item.setTextContent("item3"); 
    items_parent.appendChild(new_item); 

nội dung mới của tập tin:

<items> 


    <item>item3</item> 
</items> 

Những dòng trống gây phiền nhiễu xuất hiện vì removeChild() loại bỏ đứa trẻ, nhưng nó để lại thụt của con loại bỏ, và dòng phá vỡ quá. Và indent_and_like_break này được coi là nội dung văn bản, còn lại trong tài liệu.

Trong related question tôi đăng workaround:

items_parent.setTextContent(""); 

Nó loại bỏ các dòng trống. Nhưng đây là một số hạn chế của hack, nó loại bỏ hiệu ứng, không phải nguyên nhân.

Vì vậy, câu hỏi đặt ra là xóa nguyên nhân: cách xóa con bằng ý định ngắt dòng?

+2

Kiểm tra [this] (http://stackoverflow.com/questions/978810/how-to-strip-whitespace-only-text-nodes-from-a-dom-before-serialization) – MadProgrammer

+0

Cảm ơn bạn, giải pháp này đã được giải quyết vấn đề đối với tôi. Bạn có thể thêm câu trả lời này như một câu trả lời và tôi sẽ chấp nhận nó. Hoặc, câu hỏi này không thực sự chính xác, vì vậy, có thể gắn cờ nó là trùng lặp hoặc thậm chí xóa, không chắc chắn .. –

+0

Nếu bạn thích nó, hãy bỏ phiếu cho câu hỏi được liên kết – MadProgrammer

Trả lời

12

"thụt lề" trước phần tử và "dấu xuống dòng" (và sau thụt lề) sau đó là các nút văn bản. Nếu bạn loại bỏ một phần tử và có một nút văn bản trước hoặc sau nó, một cách tự nhiên các nút đó không bị xóa.

Có vẻ như bạn muốn xóa phần tử và sau đó cũng xóa nút văn bản ở phía trước nó (miễn là nó bao gồm toàn bộ khoảng trắng).

Ví dụ: có lẽ cùng những dòng này (trong vòng lặp của bạn loại bỏ mặt hàng):

Element curElement = (Element)items.item(i); 
// Start new code 
Node prev = curElement.getPreviousSibling(); 
if (prev != null && 
    prev.getNodeType() == Node.TEXT_NODE && 
    prev.getNodeValue().trim().length() == 0) { 
    items_parent.removeChild(prev); 
} 
// End new code 
items_parent.removeChild(curElement); 

Tuy nhiên, câu hỏi thực sự có lẽ nên được tại sao tài liệu XML của bạn có các nút văn bản khoảng trắng không liên quan trong đó.

+0

Cảm ơn, giải pháp của bạn hoạt động để xóa bỏ thụt lề thực sự trước phần tử! Ohh, tôi bối rối: bạn đã cho tôi câu trả lời chính xác về câu hỏi của tôi, nhưng bây giờ tôi hiểu rằng cách tiếp cận này (của tôi) dường như là hacky .. xấu của tôi. Lấy làm tiếc. Không chắc tôi nên chấp nhận câu trả lời nào :) –

+0

@DmitryFrank: Cảm ơn bạn đã chỉnh sửa! Kiểm tra rất quan trọng ... –

+1

prev.getNodeValue(). Trim() là một String để prev.getNodeValue(). Trim().chiều dài nên được thay đổi thành prev.getNodeValue(). trim(). length(). Nếu không, câu trả lời tuyệt vời- đã giúp tôi rất nhiều. +1 –

1

Trên thực tế, tài liệu XML không phải tuân theo bất kỳ nguyên tắc về kiểu nào. Do đó bạn không thể ngoại trừ các phương thức thao tác tài liệu để giữ một kiểu kiểu nào đó cho tài liệu của bạn. Những gì tôi khuyên bạn nên thường thao tác tập tin của bạn đầu tiên mà không có bất kỳ sự tôn trọng định dạng (chỉ cần nhận được một tập tin xml hợp lệ) và sau đó bạn luôn có thể chạy một định dạng trên toàn bộ tài liệu để có được định dạng mong muốn của bạn. Chúc vui vẻ!

+0

Vâng, bạn nói đúng. Liên kết của MadProgrammer giải quyết được rắc rối cho tôi, và cách tiếp cận của bạn là chính xác. –

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