2014-03-06 3 views
2

"{Some Text}"이 포함 된 단락을 제거하려고합니다. 아래의 방법은 그 일을 처리하지만 단락을 제거한 후에는 빈 단락 요소가 남아있는 것으로 나타났습니다.빈 단락 요소를 제거하려면 어떻게해야합니까?

<w:p /> 요소를 프로그래밍 방식으로 제거하려면 어떻게해야합니까?

다음은 처음 단락을 제거하는 데 사용 된 내용입니다. document.xml이 afterwords과 같은 방법

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(file, true)) 
     { 
      MainDocumentPart mainPart = wordDoc.MainDocumentPart; 
      Document D = mainPart.Document; 

      foreach (Paragraph P in D.Descendants<Paragraph>()) 
      { 
       if (P.InnerText.Contains("{SomeText}")) 
       { 
        P.RemoveAllChildren(); 
        //P.Remove(); //doesn't remove 
       } 
      } 
      D.Save(); 
     } 

입니다 :

<w:p /> 
<w:p /> 
<w:p /> 
<w:p /> 
<w:p /> 
<w:p /> 
<w:p /> 
+1

그냥 추측하십시오 - "not"가 누락 되었습니까? 'if (! P.InnerText.Contains ("{SomeText}"))'? –

+0

7 단락이 최상위 태그입니까? – rene

+0

예, 최상위 태그입니다. @rene –

답변

6

여기서 문제 :

 foreach (Paragraph P in D.Descendants<Paragraph>()) 
     { 
      if (P.InnerText.Contains("{SomeText}")) 
      { 
       P.Remove(); //doesn't remove 
      } 
     } 

당신이 컬렉션에서 항목을 제거하려고인가요 당신 동안 여전히 그것을 반복하고있다. 이상한 이유로 OpenXML SDK는 실제로 여기에 예외를 던지지 않고 단지 foreach 루프를 자동 종료합니다. 디버거를 연결하고 단계별로 실행하면 표시됩니다. 수정은 간단하다

 foreach (Paragraph P in D.Descendants<Paragraph>().ToList()) 
     { 
      if (P.InnerText.Contains("{SomeText}")) 
      { 
       P.Remove(); //will now remove 
      } 
     } 

별도의 목록에 단락을 ToList() 당신이 복사 (얕은 복사)를 추가하고 그 목록을 반복하여. 이제 단락을 제거하면 D.Descendants<Paragraph>() 컬렉션에서 제거되지만 목록에서는 삭제되지 않으므로 반복됩니다.

+0

이것은 논리적 대답 인 것처럼 보이지만 루프를 종료한다고 생각하기는 어렵습니다. – jn1kk

+0

@jsn : 알아, 이상하다.하지만 실제로 그렇다. 디버거를 부착하고 단계별로 진행하면,'P.Remove()'(첫 번째 경우)에 도달하자마자 루프의 닫는 괄호로 이동 한 후 다음 명령문으로 건너 뜁니다. 정말 예외를 던져야하지만, 누군가 그걸로 끝났다고 생각합니다. –

+0

네 말이 맞아. 매트, 작동하지. 관련이 없지만 문서를 반복하고 모든 ''요소를 제거 할 수있는 방법이 있습니까? (예 : 문서를 만들 때 Enter 키를 누를 때)? –

관련 문제