2017-06-29 41 views
1

我有一個程序處理一些文檔,並根據業務規則創建CustomXMLParts併爲每個零件創建ContentControl。 這是用OpenXML創建CustomXMlPart並將Guid作爲屬性添加的函數。這個Guid被用來鏈接到一個ContentControl。如何在OpenXML中獲取CustomXMLPart的Guid Id

private static void InsertMetadata(WordprocessingDocument document, Dictionary<string, object> metaData, string customPartName, string id = null) 
{  
    XElement metadataElement = null; 
    CustomXmlPart customXml = null; 
    if (id != null) 
    { 
     metadataElement = new XElement(customPartName, new XAttribute("Guid", "NeedsID")); 
     customXml = document.MainDocumentPart.AddCustomXmlPart(CustomXmlPartType.CustomXml); 
     var guidID = document.MainDocumentPart.GetIdOfPart(customXml); 

    } 
    else 
    { 
     metadataElement = new XElement(customPartName); 
     customXml = document.MainDocumentPart.AddCustomXmlPart(CustomXmlPartType.CustomXml); 
    } 

    foreach (KeyValuePair<string, object> entry in metaData) 
    { 
     metadataElement.Add(new XElement(entry.Key, entry.Value)); 
    } 

    using (StreamWriter sr = new StreamWriter(customXml.GetStream())) 
    { 
     sr.Write(metadataElement); 
    } 
}    

有一個WordAddIn 讀取這樣的部件,並設置Guid屬性到customXML元件

foreach (CustomXMLPart part in userAction.Application.ActiveDocument.CustomXMLParts.OfType<CustomXMLPart>()) 
{ 
    var section = part.SelectSingleNode("MySection"); 
    if (section!=null) 
    { 
     part.SetAttributeValue("Guid", part.Id.ToString()); 
    } 
} 

在WordAddIn的CustomXMLPart的ID具有屬性Id,它是一個GUID。 AddIn讀取零件並使用作爲零件標識的Guid更新屬性。

我遇到的問題是我可以創建XML部分沒有問題,我可以創建ContentControl並添加Guid的標籤,以便CC和XMLpart鏈接。 我創建CustomXMLPart然後CC和我添加guid鏈接。然而, 使用OPENXML時,我不能得到的ID爲我創建後一個GUID,並把它添加到DocumentPart

var guidID = document.MainDocumentPart.GetIdOfPart(customXml); 

這不返回一個GUID。它返回這樣的事情Rd96388a5e95041a0


但我需要一個GUID,所以我可以將其添加爲標籤的CC。 我無法想象添加CustomXMLPart與預定義Guid的方式,所以我只是創建該部分,然後嘗試獲取Id。

回答

2

首先,AddCustomXmlPart有一個構造函數,它接受id:MainDocumentPart.AddCustomXmlPart method (CustomXmlPartType, String)作爲字符串。 所以,你可以這樣做:

var customXml = doc.MainDocumentPart.AddCustomXmlPart(CustomXmlPartType.CustomXml, Guid.NewGuid().ToString()); 

警告!

似乎合乎邏輯,但等待。想一下你在這裏想要做什麼?您正試圖將Guid作爲xsd:ID!如果您不知道

xsd:ID類型用於唯一標識XML文檔中元素的屬性。 xsd:ID值必須是NCName。這意味着它必須以字母或下劃線開頭,並且只能包含字母,數字,下劃線,連字符和句點。

全部是Guids以字母開頭嗎?沒有!所以上面的這條線有時會起作用,否則就會拋出異常。所以問題是你真的需要Guids

如果你仍然堅持使用Guids然後在每個新的guid後面加上一個char,並且在將字符串id解析爲Guid時小心地將其刪除。