以编程方式更新Word(OpenXml)内容控件DataBinding - 找出XPath

时间:2015-09-30 15:37:36

标签: c# ms-word metadata openxml openxml-sdk

更新:我解决了这个问题(借助http://dbe.codeplex.com中的一些代码)。

我遇到一个问题,我的xml文件中的元数据没有显示在word文件中。它显示[MyFieldName]而不是3354

我发现快速部分不工作的原因是它的DataBinding。

  • 如果我在Word中添加第二个快速部分并将其链接到同一文档属性,它将显示元数据属性。
  • 如果我现在将“工作”DataBinding添加到不起作用的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}" />

  1. 为什么没有PrefixMapping?显然它不是必需的。
  2. 仍然使用ns6:MyFieldName,我想知道ns6在哪里定义..?
  3. 为什么 /ns6:MyFieldName[1]?我怎么知道它不是ns374

1 个答案:

答案 0 :(得分:0)

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

因此,您必须在运行时执行一些命名空间管理以获取给定命名空间的前缀。您需要查找命名空间文字才能执行此操作。

例如,ns0可能就是这个: 的xmlns =“http://schemas.openxmlformats.org/officeDocument/2006/custom-properties

如果您在CustomXMLPart中的Custom xml中使用了命名空间,那么您将链接到内容控件,这可能是分配给ns6的内容控件。