public void FillValues() { logger.Info("Заполняем поля документа..."); XmlDocument content = GetXMLDocument("content.xml"); XmlNamespaceManager nsMgr = new XmlNamespaceManager(content.NameTable); nsMgr.AddNamespace("office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0"); nsMgr.AddNamespace("text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0"); nsMgr.AddNamespace("table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0"); foreach (XmlNode node in content.SelectNodes("/office:document-content/office:body/office:text/text:user-field-decls/text:user-field-decl", nsMgr)) { string fieldName = node.Attributes ["text:name"].Value; var field = DocParser.FieldsList.Find(f => fieldName.StartsWith(f.Name)); if (field == null) { logger.Warn("Поле {0} не найдено, поэтому пропущено.", fieldName); continue; } SetFieldValue(node, field.Type, field.Value); } //Строка и поле var tableFields = new List <odtFieldSet>(); foreach (XmlNode node in content.SelectNodes("//table:table-row//text:variable-set", nsMgr)) { string fieldName = node.Attributes["text:name"].Value; //Ищем в таблицах var field = DocParser.TablesFields.FirstOrDefault(f => fieldName.StartsWith(f.Name)); if (field != null) { var fieldSet = new odtFieldSet(); fieldSet.Field = field; fieldSet.FieldNode = node; fieldSet.RowNode = FineParent(node, "table:table-row"); fieldSet.TableNode = FineParent(node, "table:table"); tableFields.Add(fieldSet); } } if (tableFields.Count > 0) { //Удаляем уже заполненые строки. var toDelete = new List <odtFieldSet>(); foreach (var table in tableFields.GroupBy(x => x.TableNode)) { XmlNode firstRow = null; foreach (var byTable in table) { if (firstRow == null) { firstRow = byTable.RowNode; } else if (firstRow != byTable.RowNode) { toDelete.Add(byTable); } } } foreach (var delete in toDelete) { tableFields.Remove(delete); } foreach (var row in toDelete.GroupBy(x => x.RowNode)) { row.First().TableNode.RemoveChild(row.Key); } //Заполняем поля добавляя строки foreach (var table in tableFields.GroupBy(x => x.TableNode)) { XmlNode curentRow = table.First().RowNode; var rowCounts = table.First().Field.DataTable.DataRowsCount; for (int i = 0; i < rowCounts; i++) { foreach (XmlNode fieldNode in curentRow.SelectNodes(".//text:variable-set", nsMgr)) { string fieldName = fieldNode.Attributes["text:name"].Value; var info = table.FirstOrDefault(x => fieldName.StartsWith(x.Field.Name)); if (info != null) { SetFieldVariableValue(fieldNode, info.Field.Type, info.Field.GetValue(i)); } } if (i + 1 < rowCounts) { //Создаем новую строку var newRow = curentRow.CloneNode(true); var tableNode = table.First().TableNode; tableNode.InsertAfter(newRow, curentRow); curentRow = newRow; } } } } UpdateXmlDocument(content, contentFileName); }
public void FillValues() { logger.Info ("Заполняем поля документа..."); XmlDocument content = GetXMLDocument("content.xml"); XmlNamespaceManager nsMgr = new XmlNamespaceManager(content.NameTable); nsMgr.AddNamespace("office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0"); nsMgr.AddNamespace("text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0"); nsMgr.AddNamespace("table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0"); foreach (XmlNode node in content.SelectNodes ("/office:document-content/office:body/office:text/text:user-field-decls/text:user-field-decl", nsMgr)) { string fieldName = node.Attributes ["text:name"].Value; var field = DocParser.FieldsList.Find (f => fieldName.StartsWith (f.Name)); if (field == null) { logger.Warn ("Поле {0} не найдено, поэтому пропущено.", fieldName); continue; } SetFieldValue(node, field.Type, field.Value); } //Строка и поле var tableFields = new List<odtFieldSet>(); foreach (XmlNode node in content.SelectNodes ("//table:table-row//text:variable-set", nsMgr)) { string fieldName = node.Attributes["text:name"].Value; //Ищем в таблицах var field = DocParser.TablesFields.FirstOrDefault(f => fieldName.StartsWith(f.Name)); if (field != null) { var fieldSet = new odtFieldSet(); fieldSet.Field = field; fieldSet.FieldNode = node; fieldSet.RowNode = FineParent(node, "table:table-row"); fieldSet.TableNode = FineParent(node, "table:table"); tableFields.Add(fieldSet); } } if(tableFields.Count > 0) { //Удаляем уже заполненые строки. var toDelete = new List<odtFieldSet>(); foreach(var table in tableFields.GroupBy(x => x.TableNode)) { XmlNode firstRow = null; foreach(var byTable in table) { if (firstRow == null) firstRow = byTable.RowNode; else if(firstRow != byTable.RowNode) { toDelete.Add(byTable); } } } foreach(var delete in toDelete) { tableFields.Remove(delete); } foreach(var row in toDelete.GroupBy(x => x.RowNode)) { row.First().TableNode.RemoveChild(row.Key); } //Заполняем поля добавляя строки foreach(var table in tableFields.GroupBy(x => x.TableNode)) { XmlNode curentRow = table.First().RowNode; var rowCounts = table.First().Field.DataTable.DataRowsCount; for(int i = 0; i < rowCounts; i++) { foreach(XmlNode fieldNode in curentRow.SelectNodes(".//text:variable-set", nsMgr)) { string fieldName = fieldNode.Attributes["text:name"].Value; var info = table.FirstOrDefault(x => fieldName.StartsWith(x.Field.Name)); if(info != null) { SetFieldVariableValue(fieldNode, info.Field.Type, info.Field.GetValue(i)); } } if(i + 1 < rowCounts) {//Создаем новую строку var newRow = curentRow.CloneNode(true); var tableNode = table.First().TableNode; tableNode.InsertAfter(newRow, curentRow); curentRow = newRow; } } } } UpdateXmlDocument (content, contentFileName); }