【问题标题】:Update Word (OpenXml) Content Control DataBinding programmatically - figure out XPath以编程方式更新 Word (OpenXml) 内容控件 DataBinding - 找出 XPath
【发布时间】:2015-09-30 15:37:36
【问题描述】:

更新:我解决了这个问题(借助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 dataBinding = new DataBinding();
//dataBinding.PrefixMappings = validBinding.PrefixMappings;
//dataBinding.XPath = validBinding.XPath;
dataBinding.StoreItemId = _customXmlPart.CustomXmlPropertiesPart.DataStoreItem.ItemId;

如何获取 XPath?
工作数据绑定看起来像 &lt;w:dataBinding w:xpath="/ns0:properties[1]/documentManagement[1]/ns6:MyFieldName[1]" w:storeItemID="{45C2489E-0875-4E37-AE02-CFEAFC2294DC}" /&gt;

  1. 为什么没有前缀映射?显然不需要。
  2. 它仍然使用 ns6:MyFieldName,我想知道 ns6 是在哪里定义的......?

为什么/ns6:MyFieldName[1]?我怎么知道不是@​​987654328@?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多