C# 在OpenXml的Word文档中按标记名查找内容控件

C# 在OpenXml的Word文档中按标记名查找内容控件,c#,openxml,contentcontrol,C#,Openxml,Contentcontrol,我正在尝试使用OpenXml将文本插入到word文档模板中的内容控件中。首先,我通过标记名搜索内容控件,然后在SdtBlock中添加段落元素,如下所示 SdtBlock contentBlock = wordDoc.MainDocumentPart.Document.Body.Descendants<SdtBlock>() .Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "AssessmentSe

我正在尝试使用OpenXml将文本插入到word文档模板中的内容控件中。首先,我通过标记名搜索内容控件,然后在SdtBlock中添加段落元素,如下所示

SdtBlock contentBlock = wordDoc.MainDocumentPart.Document.Body.Descendants<SdtBlock>()
   .Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "AssessmentSection")
   .Single();
SdtBlock contentBlock=wordDoc.MainDocumentPart.Document.Body.subjects()
.Where(r=>r.SdtProperties.GetFirstChild().Val==“AssessmentSection”)
.Single();
但当我执行这条语句时,我得到了“对象引用未设置为对象的实例”错误消息。模板文档已经有了另一个内容控件,我可以使用上面相同的语句找到该控件,但标记名不同。但在模板中添加“AssessmentSection”内容控件后,在运行程序时,“AssessmentSection”控件出现“Object Reference…”错误,程序失败。我确信新的内容控件标记名称和标题与其他内容控件是唯一的


有人能帮我解释为什么会出现这种奇怪的行为以及如何修复吗?

您还可以循环文档内容控件项并检查它们的标记,如:

foreach (Word.ContentControl contentcontrol in wordDoc.ContentControls)
{
   if (contentcontrol.Tag != null)
   {
          ...
   }
}

什么实际上是空的?在where子句中,您有
r.SdtProperties
,如果集合中任何元素的
SdtProperties
为null,则将获得null引用。如果有可能,请检查它:
r=>r.SdtProperties!=null&&r.SdtProperties.GetFirstChild…
您可能还需要检查
GetFirstChild()
是否确实为所有元素返回了某些内容。如果没有,你也会得到空引用。看看我的-这有帮助吗?这不是一个完整的答案,但可能对其他原因有用,而不是OPs问题。这看起来像Eric White博客中的示例代码中的一个片段:。