以编程方式更新Word (OpenXml)内容控制数据绑定-找出XPath
本文关键字:数据绑定 内容控制 找出 XPath OpenXml 方式 编程 更新 Word | 更新日期: 2023-09-27 18:15:14
更新:我解决了这个问题(借助http://dbe.codeplex.com的一些代码)。
我有一个问题,从我的xml文件的元数据没有显示在word文件。它说的是[MyFieldName]
,而不是例如3354
。
我发现快速部分不工作的原因是它的数据绑定。
- 如果我在Word中添加第二个快速部分并将其链接到相同的文档属性,它将显示元数据属性。
- 如果我现在将"工作"数据绑定添加到不工作的SdtBlock (SdtProperties) -原始控件也将工作!
下面的代码修复具有无效数据绑定的第二个字段控件。
DataBinding validBinding = null;
int count = 0;
foreach (OpenXmlElement openXmlElement in _contentControls)
{
SdtProperties sdtProperties = openXmlElement.Elements<SdtProperties>().FirstOrDefault();
if (sdtProperties == null)
{
throw new Exception("Expected to find some sdt properties!");
}
Tag tag = sdtProperties.Elements<Tag>().FirstOrDefault();
Console.WriteLine("'nProcessing SDT: {0}.", tag.Val);
SdtContentRun sdtContent = openXmlElement.Elements<SdtContentRun>().Single();
Console.WriteLine("Current value: " + sdtContent.InnerText);
if (!sdtContent.InnerText.StartsWith("["))
{
// working control
Console.WriteLine("Found working control");
validBinding = sdtProperties.Elements<DataBinding>().Single();
}
else
{
Console.WriteLine("Found not working control");
DataBinding dataBinding = sdtProperties.Elements<DataBinding>().FirstOrDefault();
if (dataBinding != null) dataBinding.Remove();
dataBinding = new DataBinding();
//dataBinding.PrefixMappings = validBinding.PrefixMappings;
dataBinding.XPath = validBinding.XPath;
dataBinding.StoreItemId = _customXmlPart.CustomXmlPropertiesPart.DataStoreItem.ItemId;
sdtProperties.Append(dataBinding);
}
}
我如何创建一个新的工作数据绑定,而不是在MS Word中创建一个快速部件并复制其设置?
DataBinding dataBinding = new DataBinding();
//dataBinding.PrefixMappings = validBinding.PrefixMappings;
//dataBinding.XPath = validBinding.XPath;
dataBinding.StoreItemId = _customXmlPart.CustomXmlPropertiesPart.DataStoreItem.ItemId;
如何获得XPath?
工作数据绑定看起来像<w:dataBinding w:xpath="/ns0:properties[1]/documentManagement[1]/ns6:MyFieldName[1]" w:storeItemID="{45C2489E-0875-4E37-AE02-CFEAFC2294DC}" />
- 为什么没有PrefixMapping?显然这不是必需的。
- 仍然使用ns6:MyFieldName,我想知道ns6在哪里被定义…?
为什么 /ns6:MyFieldName[1]
?我怎么知道它不是ns374
?
ns#:条目是对节点所属的名称空间(名称空间前缀)的引用。这些是由Word在运行时分配的,并且是不可预测的。这意味着,在将来的某个时候,ns6可能无法工作。
因此,您必须在运行时执行一些命名空间管理以获取给定命名空间的前缀。要做到这一点,您需要查找名称空间字面量。
例如,ns0可能是这样的:xmlns = " http://schemas.openxmlformats.org/officeDocument/2006/custom-properties
如果你在CustomXMLPart的Custom xml中使用了一个名称空间,你要链接到内容控件,那可以是分配给ns6的名称空间。