如何在OpenXML中获取CustomXMLPart的Guid Id

时间:2017-06-29 15:09:39

标签: c# .net openxml office-interop openxml-sdk

我有一个处理某些文档的程序,并根据业务规则创建CustomXMLParts并为每个部分创建ContentControl。 这是使用OpenXML创建CustomXMlPart并添加Guid作为属性的函数。此Guid用于链接到ContentControl。

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元素的ID

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,它是一个Guid。 AddIn读取部件并使用Guid更新属性,Guid是部件的ID。

我遇到的问题是我可以创建XML部件没问题,我可以创建ContentControl并添加Guid的标签,以便CC和XMLpart链接。 我创建CustomXMLPart然后CC和我添加guid链接。然而, 在使用openXML时,我无法在创建并将其添加到DocumentPart后将ID作为guid

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

这不会返回Guid。它返回类似这样的东西Rd96388a5e95041a0

但我需要一个Guid,所以我可以将它作为标签添加到CC。 我无法找到一种方法来添加带有预定义Guid的CustomXMLPart,所以我只需创建该部分然后尝试获取Id。

1 个答案:

答案 0 :(得分: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时小心删除它。