2010-10-08 10 views
0

У меня есть программа на C#, которая перебирает все формы (с поддержкой браузера) в моей библиотеке форм и вводит узел XML в каждую из них (для вновь созданного поля) , По какой-то причине, когда XML сохраняется в форме, первые несколько тегов удаляются. В частности, эти теги:Программируемое обновление формы InfoPath XML отбрасывает теги

<?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?>" 

Мой код для обновления XML выглядит следующим образом:

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

Добавление нового узла работает правильно; Я вижу, что новый XML правильно сформирован. Просто теги удаляются после загрузки файла из MemoryStream в объект XmlDocument. И как только эти теги отсутствуют, формы больше не будут открываться в IP.

ПОЖАЛУЙСТА, ПОМОГИТЕ!

Спасибо!

ответ

0

Измените строку, которая гласит:

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

следующим образом:

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