2017-06-29 1 views
1

J'ai un programme qui traite certains documents et, basé sur des règles métier, crée CustomXMLParts et crée ContentControl pour chaque partie. C'est la fonction qui crée le CustomXMlPart avec OpenXML et ajoute un Guid en tant qu'attribut. Ce Guid est utilisé pour lier à un ContentControl.Comment obtenir l'ID Guid de CustomXMLPart dans 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); 
    } 
}    

Il y a un WordAddIn qui lit les parties comme celle-ci et définit l'attribut Guid à l'ID de l'élément 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()); 
    } 
} 

Dans le WordAddIn le CustomXMLPart a la propriété Id et est un Guid. L'AddIn lit les pièces et met à jour l'attribut avec le Guid correspondant à l'ID de la pièce. Le problème que je rencontre est que je peux créer les parties XML sans problème et je peux créer le ContentControl et ajouter le tag du Guid pour que CC et XMLpart soient liés. Je crée le CustomXMLPart puis le CC et i Ajoutez le guid à lier. Cependant, lorsque vous utilisez OpenXML je ne peux pas obtenir l'ID comme guid après que je l'ai créé et ajouté à la DocumentPart

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

Cela ne renvoie pas Guid. Elle retourne quelque chose comme ça Rd96388a5e95041a0


Mais je besoin d'un Guid si je peux l'ajouter comme une étiquette à la CC. Je n'arrivais pas à trouver un moyen d'ajouter un CustomXMLPart avec un Guid prédéfini, donc je crée simplement la pièce, puis j'essaie d'obtenir l'Id.

Répondre

2

D'abord, AddCustomXmlPart a un constructeur qui accepte l'ID: MainDocumentPart.AddCustomXmlPart method (CustomXmlPartType, String) comme une chaîne. Alors vous pourriez faire quelque chose comme:

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

ATTENTION!

Cela semble logique, mais attendez. Pensez qu'est-ce que vous essayez vraiment de faire ici? Vous essayez d'affecter Guid comme xsd:ID! Au cas où vous ne le sauriez pas

Le type xsd: ID est utilisé pour un attribut qui identifie de manière unique un élément dans un document XML. Une valeur xsd: ID doit être un NCName. Cela signifie qu'il doit commencer par une lettre ou un trait de soulignement et ne peut contenir que des lettres, des chiffres, des traits de soulignement, des traits d'union et des points.

Tout commencer par Guids commence par une lettre? NON! Donc la ligne ci-dessus fonctionnera parfois et jettera une exception sinon. Donc, la question est de savoir si vous avez vraiment besoin de Guids?

Si vous persistez à utiliser Guids, ajoutez chaque nouveau guide avec un caractère au début et veillez à le supprimer tout en analysant l'identifiant de chaîne à Guid.