打开 XML 字内容控件
Open XML word content controls
这是我的代码,试图获取带有标签 "company"
的内容控件
using (WordprocessingDocument template = WordprocessingDocument.Open("d:/dev/ProposalTemplate1.dotx", true))
{
MainDocumentPart mainPart = template.MainDocumentPart;
SdtBlock block = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "TEST").Single();
Text t = block.Descendants<Text>().Single();
t.Text = "COMPANY_NAME";
}
由于查询行,我收到错误 "Object reference not set to an instance of an object",但我不知道为什么...
这在我创建一个只有一个内容控件的简单模板时效果很好,但在使用更大的单词模板时效果不佳
有什么想法吗?
编辑
我尝试在没有 .Single()
的情况下这样做,但仍然无法正常工作
MainDocumentPart mainPart = template.MainDocumentPart;
var blocks = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "Company");
foreach (SdtBlock block in blocks)
{
Text t = block.Descendants<Text>().Single();
t.Text = "COMPANY1";
}
编辑 2
我改变了 Text.Single()
问题仍然存在 "Object reference not set to an instance of an object" SdtBlock block = ...
行
MainDocumentPart mainPart = template.MainDocumentPart;
var blocks = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "Company");
foreach (SdtBlock block in blocks)
{
var t = block.Descendants<Text>();
foreach (Text text in t)
{
text.Text = "COMPANY1";
}
}
并非所有 SdtBlock
元素都有子 Tag
元素。您假设一个存在并尝试访问 Val
属性 但在这样做时得到空引用异常。
您可以通过检查 Where
谓词中的 null 来修复它:
var blocks = mainPart.Document.Body.Descendants<SdtBlock>().Where(r =>
{
var tag = r.SdtProperties.GetFirstChild<Tag>();
return tag != null && tag.Val == "Company";
});
根据评论,在我的 .
中有更多关于您最初使用 Single
时遇到的问题的信息
试试这个:
foreach( SdtBlock sdt in sdtList )
{
if( sdt.SdtProperties != null )
{
Tag tag = sdt.SdtProperties.GetFirstChild<Tag>();
if( tag!= null )
{
if( tag.Val.Value == "Company" )
{
if( sdt.InnerText != string.Empty )
{
//Do something
}
}
}
}
}
接受的解决方案returns我的查询也没有结果。所以我想出了这个解决方案;
var doc = document.MainDocumentPart.Document;
List<Tag> sdtSubTable = doc.Body.Descendants<Tag>().Where(r =>
{
return r != null && r.Val.Value.Contains("Company");
}).ToList();
这是我的代码,试图获取带有标签 "company"
的内容控件 using (WordprocessingDocument template = WordprocessingDocument.Open("d:/dev/ProposalTemplate1.dotx", true))
{
MainDocumentPart mainPart = template.MainDocumentPart;
SdtBlock block = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "TEST").Single();
Text t = block.Descendants<Text>().Single();
t.Text = "COMPANY_NAME";
}
由于查询行,我收到错误 "Object reference not set to an instance of an object",但我不知道为什么...
这在我创建一个只有一个内容控件的简单模板时效果很好,但在使用更大的单词模板时效果不佳
有什么想法吗?
编辑
我尝试在没有 .Single()
的情况下这样做,但仍然无法正常工作
MainDocumentPart mainPart = template.MainDocumentPart;
var blocks = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "Company");
foreach (SdtBlock block in blocks)
{
Text t = block.Descendants<Text>().Single();
t.Text = "COMPANY1";
}
编辑 2
我改变了 Text.Single()
问题仍然存在 "Object reference not set to an instance of an object" SdtBlock block = ...
行
MainDocumentPart mainPart = template.MainDocumentPart;
var blocks = mainPart.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "Company");
foreach (SdtBlock block in blocks)
{
var t = block.Descendants<Text>();
foreach (Text text in t)
{
text.Text = "COMPANY1";
}
}
并非所有 SdtBlock
元素都有子 Tag
元素。您假设一个存在并尝试访问 Val
属性 但在这样做时得到空引用异常。
您可以通过检查 Where
谓词中的 null 来修复它:
var blocks = mainPart.Document.Body.Descendants<SdtBlock>().Where(r =>
{
var tag = r.SdtProperties.GetFirstChild<Tag>();
return tag != null && tag.Val == "Company";
});
根据评论,在我的
Single
时遇到的问题的信息
试试这个:
foreach( SdtBlock sdt in sdtList )
{
if( sdt.SdtProperties != null )
{
Tag tag = sdt.SdtProperties.GetFirstChild<Tag>();
if( tag!= null )
{
if( tag.Val.Value == "Company" )
{
if( sdt.InnerText != string.Empty )
{
//Do something
}
}
}
}
}
接受的解决方案returns我的查询也没有结果。所以我想出了这个解决方案;
var doc = document.MainDocumentPart.Document;
List<Tag> sdtSubTable = doc.Body.Descendants<Tag>().Where(r =>
{
return r != null && r.Val.Value.Contains("Company");
}).ToList();