我有一个处理某些文档的程序,并根据业务规则创建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。
答案 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时小心删除它。