Im Eventhandler oder in einem Workflow kann man das XML eines Infopath Dokuments verändern. Dazu liest man es wie folgt ein:
1: XmlDocument doc = new XmlDocument();
2: SPFile file = properties.ListItem.File;
3:
4: Stream stream = new MemoryStream(file.OpenBinary());
5:
6: doc.PreserveWhitespace = true;
7: doc.Load(stream);
8:
9: string tns = doc.DocumentElement.GetNamespaceOfPrefix("my"); 10:
11: nsmgr = new XmlNamespaceManager(doc.NameTable);
12: nsmgr.AddNamespace("my", tns);
Mit dem XmlDocument kann man dann über die Nodes iterieren oder auch Werte ändern.
Wichtig ist Zeile 6 - ohne diese kann es zu folgender Fehlermeldung beim Öffnen des Dokuments in FormsServices kommen:
"Das Formular wurde geschlossen"
Was im Log so aussieht:
The form template failed to load.[...] Type: SchemaValidationException, Exception Message: Schema validation found non-datatype errors.) [...]
Zum Schluss dann noch das Dokument wegschreiben:
1: Stream stream = new MemoryStream();
2: XmlTextWriter xw = new XmlTextWriter(stream, Encoding.UTF8);
3: xw.Formatting = Formatting.Indented;
4: doc.Save(xw);
5:
6: properties.ListItem.File.SaveBinary(stream);
7: properties.ListItem.File.Update();