2012-07-11 2 views
2

내가하고있는 일은 Microsoft Office Word 문서 XML의 값을 변경하여 새 파일로 저장하려고하는 것입니다. 나는 이것을 쉽게 할 수있는 SDK가 있다는 것을 알고 있지만, 유지 관리를 맡은 프로젝트는 이런 식으로 일을하고 있으며, 내가해야한다고 들었다. 나는 내 테스트 프로젝트에서 Word 문서 XML 변경하기

<root> 
    <element> 
    Fubar 
    </element> 
    <second> 
    This is the second placeholder 
    </second> 
</root> 

다음 한

:

string strRelRoot = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"; 
//the word template 
byte[] buffer = File.ReadAllBytes("dev.docx"); 
MemoryStream stream = new MemoryStream(buffer, true); 
Package package = Package.Open(stream, FileMode.Open, FileAccess.ReadWrite); 
//get the document relationship 
PackageRelationshipCollection pkgrcOfficeDocument = package.GetRelationshipsByType(strRelRoot); 
//iterate through relationship 
foreach (PackageRelationship pkgr in pkgrcOfficeDocument) 
{ 
    if (pkgr.SourceUri.OriginalString == "/") 
    { 
     //uri for the custom xml 
     Uri uriData = new Uri("/customXML/item1.xml", UriKind.Relative); 
     //delete the existing xml if it exists 
     if (package.PartExists(uriData)) 
     { 
      // Delete template "/customXML/item1.xml" part 
      package.DeletePart(uriData); 
     } 
     PackagePart pkgprtData = package.CreatePart(uriData, "application/xml"); 
      //hard coded test data 
      string xml = @"<root> 
         <element> 
          Changed 
         </element> 
         <second> 
           The second placeholder changed 
         </second> 
        </root>"; 
     Stream fromStream = pkgprtData.GetStream(); 
     //write the string 
     fromStream.Write(Encoding.UTF8.GetBytes(xml),0,xml.Length); 
     //destination file 
     Stream dest = File.Create("test.docx"); 
     //write to the destination file 
     for (int a = fromStream.ReadByte(); a != -1; a = fromStream.ReadByte()) 
     { 
      dest.WriteByte((byte)a); 
     } 

    } 
} 

은 무엇 지금 일어나고있는 것은 파일입니다

나는 다음과 같은 XML 매핑이 개 자리에 기본적인 테스트 문서가 test.docx가 생성되고 있지만 빈 문서입니다. 왜 이런 일이 일어나고 있는지 모르겠습니다. 누군가가이 접근법에서 제공 할 수있는 제안 및/또는 내가 잘못하고있는 것에 대한 제안은 대단히 감사하겠습니다. 감사합니다!

답변

2

fromStream.Write 호출 후 방금 작성한 데이터 뒤에 스트림 포인터가 위치합니다. 따라서 fromStream.ReadByte에 대한 첫 번째 통화가 이미 스트림의 끝 부분에 있으며 사용자는 아무 것도 읽지 않고 (쓰는 것).

쓰기 후 (패키지에서 반환 한 스트림이 검색을 지원하는 경우) 스트림 시작 부분에 Seek을 입력하거나 (작성한 데이터가 플러시되도록) fromStream을 닫은 다음 다시 읽기 위해 열어야합니다.

fromStream.Seek(0L, SeekOrigin.Begin); 
+0

답장을 보내 주셔서 감사합니다. 포인터를 재설정해야한다고 잘못 생각했습니다. 내 코드와 목표를 약간 수정하고 수정 사항을 게시했습니다. 감사하게 생각한다면 감사하겠습니다! – TheMethod

+1

@TheMethod 이는 목표에 상당히 중요한 수정 사항입니다. 간단히 말해, XML을 포함하는 부분을 삭제하기 전에 원본 XML을 읽은 다음 XML API 중 하나를 사용하여 작성하기 전에 원하는 값을 대체해야합니다 다시. 역사를 보지 못한 사람이이 질문을 이해하는 것을 불가능하게하려면 편집을 롤백하고 새로운 질문을하는 것이 좋습니다. – shambulator