2013-01-10 5 views
5

의는 다음과 같은 XML 문서를 생각해 보자 :removeChild() : 들여 쓰기를 제거하는 방법은 무엇입니까?

이제
<items> 
    <item>item1</item> 
    <item>item2</item> 
</items> 

,의 모든 항목을 제거하고 새로운 항목을 추가 할 수 있습니다. 코드 : 파일의

//-- 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); 

새로운 내용 : removeChild() 아동을 제거하지만 이 제거 된 아이의 들여 쓰기 잎, 라인도 중단하기 때문에

<items> 


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

이 성가신 빈 줄이 나타났다. 이 indent_and_like_break는 문서에 남아있는 텍스트 내용으로 처리됩니다. 그것은 이러한 빈 줄을 제거

items_parent.setTextContent(""); 

다음 related question에서

나는 해결 방법을 기록했다. 그러나 이것은 해킹의 몇 가지 꼬임이며, 원인이 아닌 영향을 제거합니다.

그래서, 문제는 근본 원인을 제거하는 것입니다. 줄 바꿈으로 의도적으로 자식을 제거하는 방법은 무엇입니까?

+2

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

+0

감사합니다. 나를 위해 문제. 답변을 추가 할 수 있으며 동의 할 것입니다. 또는 질문이 실제로 정확하지 않기 때문에 중복되거나 삭제해도 확실하지는 않습니다. –

+0

링크 된 질문에 투표하십시오. – MadProgrammer

답변

12

요소 앞의 "들여 쓰기"와 텍스트 노드 이후의 "캐리지 리턴"(및 들여 쓰기). 요소를 제거하고 그 앞이나 뒤에 텍스트 노드가있는 경우 자연스럽게 해당 노드가 제거되지 않습니다.

마치 요소를 제거하고 그 앞에있는 텍스트 노드를 제거하려는 경우 (공백으로만 구성된 경우) 소리가납니다. 아마도 (항목을 제거 루프에서)이 라인을 따라

예를 들면 : 당신의 XML 문서가 그 안에 여분의 공백 텍스트 노드가 왜

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); 

그러나은, 진짜 문제는 아마이어야한다.

+0

감사합니다. 귀사의 솔루션은 요소 이전에 들여 쓰기를 제거하는 데 효과적입니다! 오, 혼란 스럽네요. 당신은 제 질문에 대해 정확한 답을 주셨습니다 만, 이제는이 (내) 접근법이 해킹 된 것 같아요. 제 잘못. 죄송합니다. 어떤 대답을 받아 들여야할지 모르겠다. –

+0

@DmitryFrank : 편집 해 주셔서 감사합니다! 매우 중요한 체크 ... –

+1

prev.getNodeValue(). trim()은 문자열이므로 prev.getNodeValue(). trim().length는 prev.getNodeValue(). trim(). length()로 변경해야합니다. 그렇지 않으면 위대한 답 - 나를 많이 도왔습니다. +1 –

1

실제로 XML 문서는 스타일 가이드 라인을 따를 필요가 없습니다. 따라서 문서 조작 방법을 제외하고는 문서에 어떤 종류의 스타일을 유지할 수 없습니다.

필자가 권장하는 것은 일반적으로 형식에 관계없이 파일을 먼저 조작하는 것입니다. 그러면 올바른 형식의 파일을 얻기 위해 전체 문서에 대해 항상 포맷터를 실행할 수 있습니다.

+0

네 말이 맞아. MadProgrammer의 링크가 나를 위해 문제를 해결했으며 귀하의 접근 방식은 정확합니다. –

관련 문제