gpt4 book ai didi

c# - 在 CommentRangeStart 和 CommentRangeEnd 之间获取 OpenXmlElements

转载 作者:太空狗 更新时间:2023-10-29 21:51:14 25 4
gpt4 key购买 nike

我要做的是在 CommentRangeStart 和相应的 CommentRangeEnd 之间找到 OpenXMLElements。

我尝试了两种方法来实现此目的,但问题是 CommentRangeEnd 不需要与开始处于同一级别。它可以嵌套在一个子元素中,请参见下面非常简单的结构(请注意,这不是正确的打开 xml,它只是为了展示总体思路)。

<w:commentstart/>
<w:paragraph>
<w:run />
<w:commentend />
</w:paragraph>

我尝试过的两个项目如下:第一:我写了一个枚举,它返回项目直到结束

public static IEnumerable<OpenXmlElement> SiblingsUntilCommentRangeEnd(CommentRangeStart commentStart)
{
OpenXmlElement element = commentStart.NextSibling();

if (IsMatchingCommentEnd(element, commentStart.Id.Value))
{
yield break;
}

while (true)
{
yield return element;
element = element.NextSibling();

// Check that the item
if (element == null)
{
yield break;
}

if (IsMatchingCommentEnd(element, commentStart.Id.Value))
{
yield break;
}
}
}

public static bool IsMatchingCommentEnd(OpenXmlElement element, string commentId)
{
CommentRangeEnd commentEnd = element as CommentRangeEnd;
if (commentEnd != null)
{
return commentEnd.Id == commentId;
}
return false;
}

第二:然后意识到开始和结束不在同一水平上的问题,我继续四处寻找,我找到了 Eric Whites answer for dealing with elements between bookmark elements对于我的示例,我重新安装了它,但仍然存在开始和结束不具有相同父级(即在同一级别)的问题,我无法使用它。

有没有更好的方法来看待这个我正在寻找一种方法来处理这些元素,因为我需要处理正在评论的文本。

编辑:澄清我想要达到的目标:我正在使用 word 编辑的文档和文档中的评论,我希望获得在特定评论 ID 的开始和结束范围之间评论的文本。

编辑 2:我已经提出了我目前所想的工作版本,但我的问题是它可能会因 Word 的不同用户组合而变得非常脆弱。这也适用于 xml,这不是真正的问题,但可能希望更改为 OpenXML SDK。目前看来我需要解析整个文档来获取我需要的项目,而不是处理 1 个特定的评论。 https://github.com/mhbuck/DocumentCommentParser/

遇到的主要问题:CommentRangeStartCommentRangeEnd 可以位于 XML 文档中的不同嵌套中。根节点可能是唯一相似的祖先元素。

最佳答案

你可以尝试使用Descendants<T>()枚举给定类型节点的所有后代的方法。因此,您的代码可能看起来类似于此(我编写它时没有使用 yeld 以使其更具可读性;)):

public static IEnumerable<OpenXmlElement> SiblingsUntilCommentRangeEnd(CommentRangeStart commentStart)
{
List<OpenXmlElement> commentedNodes = new List<OpenXmlElement>();

OpenXmlElement element = commentStart;

while (true)
{
element = element.NextSibling();

// check that the item exists
if (element == null)
{
break;
}

//check that the item is matching comment end
if (IsMatchingCommentEnd(element, commentStart.Id.Value))
{
break;
}

//check that there is a matching element in the current element's descendants
var descendantsCommentEnd = element.Descendants<CommentRangeEnd>();
if (descendantsCommentEnd != null)
{
foreach (CommentRangeEnd rangeEndNode in descendantsCommentEnd)
{
if (IsMatchingCommentEnd(rangeEndNode, commentStart.Id.Value))
{
//matching range end element found in current element's descendants
//an improvement could be made here to manually select descendants before CommentRangeEnd node
break;
}
}
}

commentedNodes.Add(element);
}

return commentedNodes;
}

正如其中一条评论中所标记的,如果找到 CommentRangeEnd,它现在就结束了。当前元素的后代中的元素。

我还没有测试这段代码,所以如果你有任何问题,请在评论中告诉我。

请注意,如果起始元素在文档层次结构中比结束元素更深,则此方法将不起作用。在某些情况下,它也不会返回评论中的某些内容。如果您需要,我稍后可以使用替代解决方案更新答案来处理这种情况。还请解释为什么您需要找到这些评论,因为也许可以使用其他方法。

关于c# - 在 CommentRangeStart 和 CommentRangeEnd 之间获取 OpenXmlElements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12175491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com