2010-10-08 2 views
0

J'ai un programme C# qui parcourt tous les formulaires (navigateur activé) dans ma bibliothèque de formulaires et injecte un nœud XML dans chacun d'entre eux (pour un champ nouvellement promu) . Pour une raison quelconque, lorsque le fichier XML est enregistré dans le formulaire, les premiers tags sont supprimés. Plus précisément, ces balises sont:Mise à jour par programmation du formulaire InfoPath XML supprime les balises

<?xml version="1.0"?> 
<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:Contractor-DB-Form:-myXSD-2009-09-10T18-19-55" solutionVersion="1.0.1.1100" productVersion="12.0.0.0" PIVersion="1.0.0.0" href="http://echouat.rbs.us/npe/FormServerTemplates/Contractor_DB_Form.xsn"?> 
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?> 
<?mso-infoPath-file-attachment-present?>" 

mon code pour mettre à jour le fichier XML est la suivante:

private static SPListItem InsertXmlNode(SPListItem infoPathForm, string nodeToUpdateStr, string nodeToInsertStr, 
     string nodeInnerXmlStr, string firstNode) 
    { 
     //load form into xml document 
     byte[] fileBytes = infoPathForm.File.OpenBinary(); 
     MemoryStream itemStream = new MemoryStream(fileBytes); 
     //Stream itemStream = infoPathForm.File.OpenBinary(); 
     XmlDocument xmlDoc = new XmlDocument(); 
     XmlNamespaceManager xmlNameSpaceMgr = new XmlNamespaceManager(xmlDoc.NameTable); 
     xmlNameSpaceMgr.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-09-10T18:19:55"); 

     xmlDoc.Load(itemStream); 
     itemStream.Close(); 

     //inject xml 
     XmlNode nodeToUpdate = xmlDoc.SelectSingleNode(firstNode + nodeToUpdateStr, xmlNameSpaceMgr); 

     //only insert if doesn't already exist 
     if (xmlDoc.SelectSingleNode(firstNode + nodeToUpdateStr + "/" + nodeToInsertStr, xmlNameSpaceMgr) == null) 
     { 
      updateCounter++; 

      XmlNode nodeToInsert = xmlDoc.CreateNode(XmlNodeType.Element, nodeToInsertStr, "http://schemas.microsoft.com/office/infopath/2003/myXSD/2009-09-10T18:19:55"); 
      nodeToInsert.InnerText = nodeInnerXmlStr; 
      nodeToUpdate.AppendChild(nodeToInsert); 

      //get binary data for updated xml 
      byte[] newXmlData = Encoding.UTF8.GetBytes(xmlDoc.DocumentElement.OuterXml); 
      MemoryStream newMemStream = new MemoryStream(newXmlData); 

      //write updated binary data to the form 
      infoPathForm.File.SaveBinary(newMemStream); 

      newMemStream.Close(); 

      infoPathForm.File.Update(); 
     } 

     return infoPathForm; 
    } 

L'ajout du nouveau nœud fonctionne correctement; Je peux voir que le nouveau XML est correctement formé. C'est juste que les balises sont effacées une fois que le fichier est chargé depuis le MemoryStream dans l'objet XmlDocument. Et une fois que ces balises sont manquantes, les formulaires ne s'ouvriront plus dans IP.

S'IL VOUS PLAÎT AIDE!

Merci!

Répondre

0

Changer la ligne qui se lit comme suit:

byte[] newXmlData = Encoding.UTF8.GetBytes(xmlDoc.DocumentElement.OuterXml); 

à lire:

byte[] newXmlData = Encoding.UTF8.GetBytes(xmlDoc.OuterXml); 
Questions connexes