2017-06-29 13 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); 
    } 
}    

CustomXMLPartは、プロパティIDを持っており、それがこのような部品を読み取り、customXML要素のID WordAddInで

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

Guid属性を設定WordAddIn がありますGuid。 AddInはパーツを読み取り、そのパーツのIDであるGuidで属性を更新します。

問題はXMLパーツを作成することができ、ContentControlを作成してGuidのタグを追加してCCとXMLpartをリンクできるようにすることです。 CustomXMLPartを作成してからCCとiを追加して、リンクするGUIDを追加します。 OPENXMLを使用している場合しかし、 は、私が作成した後にGUIDなどのIDを取得し、DocumentPart

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

これは、GUIDを返しませんにこれを追加しましたカント。これは、このRd96388a5e95041a0


のようなものを返します。しかし、私はので、私はCCにタグとして追加することができますGUIDを必要とします。 あらかじめ定義されたGuidを持つCustomXMLPartを追加する方法を考え出すことができなかったので、その部分を作成してIDを取得しようとしました。

答えて

2

まず、AddCustomXmlPartには、id:MainDocumentPart.AddCustomXmlPart method (CustomXmlPartType, String)を文字列として受け取るコンストラクタがあります。

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

WARNING: は、だからあなたのような何かを行うことができます!

論理的ですが、待ってください。ここで本当に何をしようとしていますか? Guidxsd:IDとして割り当てようとしています。あなたが気づいていない場合

xsd:IDタイプは、XMLドキュメント内の要素を一意に識別する属性に使用されます。 xsd:ID値はNCNameでなければなりません。これは、文字またはアンダースコアで始まり、文字、数字、アンダースコア、ハイフン、ピリオドのみを含む必要があることを意味します。

Guidsは手紙で始まりますか?いいえ!したがって、上記の行は時々動作し、それ以外の場合は例外がスローされます。だから質問は本当にGuidsが必要ですか?

Guidsを永続的に使用する場合は、最初に新しいGUIDにcharを付加して、文字列idをGuidに解析する際に注意してください。

関連する問題