簡體   English   中英

以編程方式更新Word(OpenXml)內容控制數據綁定-找出XPath

[英]Update Word (OpenXml) Content Control DataBinding programmatically - figure out XPath

更新:我解決了這個問題(借助於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在哪里定義..?

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

ns#:條目是對節點所屬的名稱空間(名稱空間前綴)的引用。 這些是由Word在運行時分配的,並且是不可預測的。 這意味着在將來的某個時候,ns6可能無法正常工作。

因此,您必須在運行時進行一些名稱空間管理,以獲取給定名稱空間的前綴。 為此,您需要查找名稱空間文字。

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

如果您在CustomXMLPart的Custom xml中使用了名稱空間,則您將鏈接到內容控件,該名稱空間可能是分配給ns6的名稱空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM