2016-02-09 6 views
1

Я пытаюсь вытащить текст из документа Word, на который ссылается комментарий в OpenXML. Я могу легко получить текст комментария, но не текст абзаца в документе, на который ссылается комментарий.Retrieve ссылка на комментарий OpenXML

Изображение, которое я приложил, содержит комментарий и соответствующий текст. У меня возникли проблемы с поиском примера того, как получить ссылочный текст. Как я могу получить этот текст?

Image of text I need

ответ

1

Решение получить Id комментария, который, как вы сказали, что вы уже знаете, как получить, а затем искать документ для элемента CommentRangeStart с тем же идентификатором. Когда вы его найдете, вы можете перебрать .NextSibling(), пока не нажмете элемент CommentRangeEnd.

Элементы между CommentRangeStart и CommentRangeEnd являются ссылочной частью, которая, очевидно, может представлять собой несколько прогонов, абзацев, изображений и т. Д. Поэтому вам придется как-то обрабатывать собранные элементы.

Я сделал тестовый документ, глядя, как это: document example

Я сделал этот код, чтобы проверить это:

using (var wordDoc = WordprocessingDocument.Open(@"c:\test\test.docx", true)) 
{ 
    MainDocumentPart mainPart = wordDoc.MainDocumentPart; 
    var document = mainPart.Document; 
    var comments = mainPart.WordprocessingCommentsPart.Comments.ChildElements; 
    foreach(Comment comment in comments) 
    { 
     string commentId = comment.Id; 
     string commentText = comment.InnerText; 
     OpenXmlElement rangeStart = document.Descendants<CommentRangeStart>().Where(c => c.Id == commentId).FirstOrDefault(); 
     List<OpenXmlElement> referenced = new List<OpenXmlElement>(); 
     rangeStart = rangeStart.NextSibling(); 

     while(!(rangeStart is CommentRangeEnd)) 
     { 
      referenced.Add(rangeStart); 
      rangeStart = rangeStart.NextSibling(); 
     } 

     Console.WriteLine("Comment Id " + commentId + " with text \"" + " " + commentText + "\" references =>"); 

     foreach (var ele in referenced) 
     { 
      if(!string.IsNullOrWhiteSpace(ele.InnerText)) 
      { 
       Console.WriteLine("  " + ele.InnerText); 
      } 
     } 
    } 
    Console.ReadKey(); 
} 

Который производит этот выход Console output of code

Я надеюсь, что это помогает !

+0

Спасибо! Решение, которое вы предоставили, действительно помогло мне придумать решение для моего проекта. –

+0

Если бы это был ответ, который вы искали, не могли бы вы его принять? –