2017-06-29 3 views
1

Ich habe ein Programm, das einige Dokumente verarbeitet und basierend auf Geschäftsregeln erstellt CustomXMLParts und erstellt ContentControl für jeden Teil. Dies ist die Funktion, die CustomXMlPart mit OpenXML erstellt und ein Guid als Attribut hinzufügt. Diese Guid wird zum Verknüpfen mit einem ContentControl verwendet.Wie bekomme ich Guid ID von CustomXMLPart in OpenXML

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); 
    } 
}    

Es gibt eine WordAddIn , dass die Teile wie folgt liest und setzt das Guid Attribut auf die ID des customXML Element

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

Im WordAddIn die CustomXMLPart hat die Eigenschaft Id und es ist ein Guid. Das AddIn liest die Teile und aktualisiert das Attribut mit der GUID, die die ID des Teils darstellt.

Das Problem, das ich habe ist, dass ich die XML-Teile kein Problem erstellen kann, und ich kann das ContentControl erstellen und das Tag der Guid hinzufügen, so dass die CC und XMLpart verknüpft sind. Ich erstelle die CustomXMLPart dann die CC und ich füge die Guid zu verknüpfen. Allerdings wenn OpenXML mit i cant die ID erhalten als GUID, nachdem ich erstellt habe und fügte hinzu, um es in die DocumentPart

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

Dies stellt keine Guid zurück. Es gibt so etwas wie dieses Rd96388a5e95041a0


aber ich brauche eine Guid, so kann ich es als einen Tag an den CC hinzuzufügen. Ich konnte keine Möglichkeit finden, ein CustomXMLPart mit einem vordefinierten Guid hinzuzufügen, also erstelle ich nur das Teil und versuche dann, die ID zu erhalten.

Antwort

2

Zuerst hat AddCustomXmlPart einen Konstruktor, der ID: MainDocumentPart.AddCustomXmlPart method (CustomXmlPartType, String) als Zeichenfolge akzeptiert. So könnte man so etwas wie:

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

ACHTUNG!

Scheint logisch, aber warte. Was denkst du wirklich, was du hier machen willst? Sie versuchen, Guid als xsd:ID zuzuweisen! Falls Sie sich dessen nicht bewusst sind

Der Typ xsd: ID wird für ein Attribut verwendet, das ein Element in einem XML-Dokument eindeutig identifiziert. Ein xsd: ID-Wert muss ein NCName sein. Dies bedeutet, dass es mit einem Buchstaben oder einem Unterstrich beginnen muss und nur Buchstaben, Ziffern, Unterstriche, Bindestriche und Punkte enthalten darf.

Beginnen alle Guids mit einem Buchstaben? NEIN! Die obige Zeile wird also manchmal funktionieren und ansonsten eine Ausnahme auslösen. Also die Frage ist, brauchen Sie wirklich Guids?

Wenn Sie immer noch hartnäckig sind, um Guids zu verwenden, hängen Sie jede neue GUID am Anfang an ein char an und achten Sie darauf, sie zu entfernen, während Sie die Zeichenfolgen-ID nach Guid analysieren.