如何使用OpenXML检索Microsoft Office Word中注释或书签的文本

本文关键字:注释 书签 文本 Word OpenXML 何使用 检索 Microsoft Office | 更新日期: 2023-09-27 18:03:26

我已经尝试了一段时间,使用OpenXML检索用户在.docx文档中注释或书签的文本。我尝试用每个评论/书签的开始和结束标记构建字典和数组,并尝试在XML树节点中导航,以获得文本,但我没有获得全部文本(只有第一个子节点,即第一个单词)。

IDictionary<String, BookmarkStart> bookmarkMapS = new Dictionary<String, BookmarkStart>();
IDictionary<String, BookmarkEnd> bookmarkMapE = new Dictionary<String, BookmarkEnd>();
var _bkms = doc.MainDocumentPart.RootElement.Descendants<BookmarkStart>();
var _bkme = doc.MainDocumentPart.RootElement.Descendants<BookmarkEnd>();
        foreach (BookmarkStart item in _bkms)
        {
            Run bookmarkText = item.NextSibling<Run>();
            if (bookmarkText != null)
            {
                try
                {
                    for (int i = 0; i < bookmarkText.ChildElements.Count(); i++)
                    {
                        Console.WriteLine(bookmarkText.ChildElements.ElementAt(i).InnerText);    
                    }   
                }
                catch (Exception)
                {   
                }   
            }
        }

如何使用OpenXML检索Microsoft Office Word中注释或书签的文本

可能有更好的方法来做到这一点,但这是我想到的。

List<OpenXmlElement> elems =new List<OpenXmlElement>(doc.MainDocumentPart.Document.Body.Descendants());
var crs=doc.MainDocumentPart.RootElement.Descendants<CommentRangeStart>();
var cre=doc.MainDocumentPart.RootElement.Descendants<CommentRangeEnd>();
var dic_cr=new Dictionary<CommentRangeStart, CommentRangeEnd>();
for (int i = 0; i < crs.Count(); i++)
{
    dic_cr.Add(crs.ElementAt(i), cre.ElementAt(i));
}
for (int i = 0; i < elems.Count; i++)
    if (elems.ElementAt(i).LocalName.Equals("t"))
       if (isInsideAnyComment(dic_cr, elems.ElementAt(i)))
           for (int j = 0; j < dic_cr.Count; j++)
               if (isInsideAComment(dic_cr.ElementAt(j), elems.ElementAt(i)))
                    String text = ((Text)elems.ElementAt(i)).InnerText;

public bool isInsideAnyComment(IDictionary<CommentRangeStart, CommentRangeEnd> dic_cr, OpenXmlElement item)
    {
        foreach (var i in dic_cr)
            if (item.IsAfter(i.Key) && item.IsBefore(i.Value))
                return true;
        return false;
    }
public bool isInsideAComment(KeyValuePair<CommentRangeStart, CommentRangeEnd> dic_cr_elem, OpenXmlElement item)
    {
        if (item.IsAfter(dic_cr_elem.Key) && item.IsBefore(dic_cr_elem.Value))
            return true;
        return false;
    }