以编程方式更新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?显然这不是必需的。
  1. 仍然使用ns6:MyFieldName,我想知道ns6在哪里被定义…?

为什么 /ns6:MyFieldName[1] ?我怎么知道它不是ns374 ?

以编程方式更新Word (OpenXml)内容控制数据绑定-找出XPath

ns#:条目是对节点所属的名称空间(名称空间前缀)的引用。这些是由Word在运行时分配的,并且是不可预测的。这意味着,在将来的某个时候,ns6可能无法工作。

因此,您必须在运行时执行一些命名空间管理以获取给定命名空间的前缀。要做到这一点,您需要查找名称空间字面量。

例如,

ns0可能是这样的:xmlns = " http://schemas.openxmlformats.org/officeDocument/2006/custom-properties

如果你在CustomXMLPart的Custom xml中使用了一个名称空间,你要链接到内容控件,那可以是分配给ns6的名称空间。