Программное обновление XML формы InfoPath убирает теги - PullRequest
0 голосов
/ 08 октября 2010

У меня есть программа на C #, которая перебирает все формы (браузер включен) в моей библиотеке форм и внедряет узел XML в каждую из них (для недавно повышенного поля). По какой-то причине, когда 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.

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

Спасибо!

1 Ответ

0 голосов
/ 08 октября 2010

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

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

, чтобы читать:

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