2010-06-21 6 views
0

MemoryStream으로 열어 본 단어 문서 OpenXML에서 찾기 및 바꾸려고합니다.메모리 내 XML 조작

using (WordprocessingDocument _document = WordprocessingDocument.Open(_ms, true)) 
{ 
    var placeHolder = _document.MainDocumentPart.Document 
          .Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>() 
          .Where(node => node.InnerText.Contains("***PlaceHolderText***")) 
          .FirstOrDefault(); 

    placeHolder.InnerText.Replace("***PlaceHolderText***", "hello world!"); 
} 

이것은 작동하지 않습니다. 왜 그런지 모르겠지만이 방법으로 문서를 조작하면 MemoryStream에 어떤 영향을 미치기 위해 이 보이지 않습니다.

나는 비슷한 것을하는 this blog by Eric White을 찾았지만 여전히 얻을 수 없다. 그는 XDocument을 사용하기 때문에 나는 다음과 같은 일을 가지고 :

XDocument doc = _document.MainDocumentPart.GetXDocument(); // this is an extension method 
var textNodes = doc.DescendantNodes().Where(n => n.NodeType == XmlNodeType.Text); 

이 내 문서에 올바른 노드를 발견하지만, 문제는 지금은 텍스트를 변경하는 방법을 작동하지 않을 수 있습니다. System.Xml.Linq.XNodes 내가 이런 식으로 끝나면 (DocumentFormat.OpenXml.Wordprocessing.Text 노드 대신에 내가 정말로 원한다) InnerText 또는 Value 속성이나 그와 비슷한 것이 없다. 노드에서 텍스트를 가져 오거나 업데이트 할 수있는 방법이 없습니다. 노드 캐스팅 시도했지만 컴파일되지 않았습니다.

나는 올바른 방향으로 가고 있습니까? 아니면 더 쉬운 방법이 있습니까? 모든 포인터는 매우 감사하게 될 것입니다, 감사합니다.

답변

1

나는 마침내이 작업을했습니다. 첫 번째 코드 스 니펫을 사용하면 마지막 행은 placeHolder.Text이 아니고 placeHolder.InnerText이 아니어야합니다. 나는 그것에 대해 4 시간을 낭비했다는 것을 믿을 수 없다! :

1

첫 번째 부분 (MemoryStream 업데이트). 메모리 스트림은 Open 메서드로 전달 될 때 읽기 전용으로 생각해야합니다. 파서는 스트림을 통해 읽었으며 입력 스트림에 연결되지 않은 다른 메모리 표현을 작성했습니다. Save을 사용하여 다시 작성해야합니다.

XNode의 텍스트 콘텐츠를 조작하는 경우 XText.Value을 찾고 있습니다.

+0

"Save를 사용하여 다시 작성해야합니다."Save 메서드에 대해 이야기하고 있습니까? –

+0

http://msdn.microsoft.com/en-us/library/cc838778.aspx – dkackman