检索对评论 OpenXML 的引用
Retrieve reference to comment OpenXML
我正在尝试从 Word 文档中提取文本,该文档被 OpenXML 中的评论引用。我可以轻松获取评论的文本,但无法获取评论所引用的文档中的段落文本。
我附上的图片显示了评论和相关文字。我很难找到如何获取引用文本的示例。我怎样才能得到这个文本?
解决方案是获取您所说的您已经知道如何检索的评论的 Id,然后在文档中搜索具有相同 Id 的 CommentRangeStart 元素。找到它后,您可以循环遍历 .NextSibling() 直到找到 CommentRangeEnd 元素。
CommentRangeStart和CommentRangeEnd之间的元素是被引用的部分,显然可以是多行,段落,图片什么的。所以之后你将不得不以某种方式处理收集到的元素。
我制作了一个如下所示的测试文档:
我编写了这段代码来测试它:
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();
}
产生这个输出
希望对您有所帮助!
我无法使您的解决方案生效。但是我找到了解决方法。
OpenXmlElement rangeStart = document.Descendants<CommentRangeStart>().Where(c => c.Id == commentId).FirstOrDefault();
bool breakLoop = false;
rangeStart = rangeStart.Parent;
while (true) // Looping through items between commentRangeStart and commentRangeEnd.
{
if (rangeStart.NextSibling() == null)
{
break;
}
foreach (var ele in rangeStart.ChildElements)
{
if (!(ele is CommentRangeEnd))
{
if (!(string.IsNullOrWhiteSpace(ele.InnerText)))
{
referenced.Add(ele);
}
}
else
{
breakLoop = true;
}
if (breakLoop)
break;
}
rangeStart = rangeStart.NextSibling();
}
因此,我没有循环遍历CommenRageStart 所在的段落,因为一个评论可能由多个段落组成,我使用父节点以便在段落之间来回追踪。最后,当我到达 CommentRangeEnd 时,我可以打破循环并处理数据,但是这是必需的。
我正在尝试从 Word 文档中提取文本,该文档被 OpenXML 中的评论引用。我可以轻松获取评论的文本,但无法获取评论所引用的文档中的段落文本。
我附上的图片显示了评论和相关文字。我很难找到如何获取引用文本的示例。我怎样才能得到这个文本?
解决方案是获取您所说的您已经知道如何检索的评论的 Id,然后在文档中搜索具有相同 Id 的 CommentRangeStart 元素。找到它后,您可以循环遍历 .NextSibling() 直到找到 CommentRangeEnd 元素。
CommentRangeStart和CommentRangeEnd之间的元素是被引用的部分,显然可以是多行,段落,图片什么的。所以之后你将不得不以某种方式处理收集到的元素。
我制作了一个如下所示的测试文档:
我编写了这段代码来测试它:
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();
}
产生这个输出
希望对您有所帮助!
我无法使您的解决方案生效。但是我找到了解决方法。
OpenXmlElement rangeStart = document.Descendants<CommentRangeStart>().Where(c => c.Id == commentId).FirstOrDefault();
bool breakLoop = false;
rangeStart = rangeStart.Parent;
while (true) // Looping through items between commentRangeStart and commentRangeEnd.
{
if (rangeStart.NextSibling() == null)
{
break;
}
foreach (var ele in rangeStart.ChildElements)
{
if (!(ele is CommentRangeEnd))
{
if (!(string.IsNullOrWhiteSpace(ele.InnerText)))
{
referenced.Add(ele);
}
}
else
{
breakLoop = true;
}
if (breakLoop)
break;
}
rangeStart = rangeStart.NextSibling();
}
因此,我没有循环遍历CommenRageStart 所在的段落,因为一个评论可能由多个段落组成,我使用父节点以便在段落之间来回追踪。最后,当我到达 CommentRangeEnd 时,我可以打破循环并处理数据,但是这是必需的。