Как сохранить документ в XML формате C# и .NET

  1. Добавьте SautinSoft.Document из Nuget.
  2. Загрузите или создайте документ.
  3. Сохраните в формате XML.

    В этом примере кода мы создадим таблицу и заполним ее данными. Далее преобразуем только табличные данные в формат XML.

Если Вам нужно преобразовать данные, не относящиеся к таблице, используйте свойство: dc.Save(filePath, new XmlSaveOptions { ConvertNonTabularDataToSpreadsheet = true });

Полный код

using System;
using System.IO;
using System.Xml;
using SautinSoft.Document;
using SautinSoft.Document.Drawing;
using SautinSoft.Document.Tables;

namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            // Get your free trial key here:   
            // https://sautinsoft.com/start-for-free/

            SaveToXmlFile();
        }

        /// <summary>
        /// Creates a new document and saves it as Xml file.
        /// </summary>
        /// <remarks>
        /// Details: https://www.sautinsoft.com/products/document/help/net/developer-guide/save-document-as-xml-net-csharp-vb.php
        /// </remarks>
        static void SaveToXmlFile()
        {
            string inpFile = @"..\..\..\example.docx"; 
            string outFile = Path.ChangeExtension(inpFile, ".xml");

            var dc = DocumentCore.Load(inpFile);
            var xml = GetXml(dc);
            xml.Save(outFile);
            System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(outFile) { UseShellExecute = true });
        }

        private static XmlDocument GetXml(DocumentCore dc)
        {
            var xml = new XmlDocument();
            var body = NewXmlNode(xml, xml, XmlNodeType.Element, "Document");

            foreach (Section section in dc.Sections)
            {
                var sec = NewXmlNode(xml, body, XmlNodeType.Element, "Section");
                WriteBlock(xml, sec, section.Blocks);
            }
            return xml;
        }

        private static void WriteBlock(XmlDocument xml, XmlNode parent, BlockCollection blocks)
        {
            foreach (var block in blocks)
            {
                switch (block)
                {
                    case Paragraph paragraph:
                        if (paragraph.Inlines.Count > 0)
                        {
                            var par = NewXmlNode(xml, parent, XmlNodeType.Element, "Paragraph");
                            foreach (var line in paragraph.Inlines)
                            {
                                switch (line)
                                {
                                    case Run run:
                                        var runNode = NewXmlNode(xml, par, XmlNodeType.Element, "Run");
                                        runNode.InnerText = run.Text;
                                        break;

                                    case ShapeBase shape:
                                        WriteDrawing(xml, par, shape);
                                        break;
                                }
                            }
                        }
                        break;
                    case Table table:
                        WriteTable(xml, parent, table);
                        break;
                }
            }
        }

        private static void WriteDrawing(XmlDocument xml, XmlNode parent, Element item)
        {
            if (item is ShapeGroup)
            {
                var shape = NewXmlNode(xml, parent, XmlNodeType.Element, "ShapeGroup");
                foreach (var sh in (item as ShapeGroup).ChildShapes)
                {
                    WriteDrawing(xml, shape, sh);
                }
            }
            else if (item is Picture)
            {
                var picture = NewXmlNode(xml, parent, XmlNodeType.Element, "Picture");
                var attr = xml.CreateAttribute("name");
                attr.Value = (item as Picture).Description;
                picture.Attributes.Append(attr);
            }
            else
            {
                var shape = NewXmlNode(xml, parent, XmlNodeType.Element, "Shape");
                var attr = xml.CreateAttribute("Figure");
                attr.Value = (item as Shape).Geometry.IsPreset ? ((item as Shape).Geometry as PresetGeometry).Figure.ToString() : "Custom";
                shape.Attributes.Append(attr);
                WriteBlock(xml, shape, (item as Shape).Text.Blocks);
            }
        }

        private static void WriteTable(XmlDocument xml, XmlNode parent, Table table)
        {
            var tab = NewXmlNode(xml, parent, XmlNodeType.Element, "Table");
            XmlAttribute attr = xml.CreateAttribute("rows");
            attr.Value = table.Rows.Count.ToString();
            tab.Attributes.Append(attr);
            attr = xml.CreateAttribute("cols");
            attr.Value = table.Columns.Count.ToString();
            tab.Attributes.Append(attr);
            for (int i = 0; i < table.Rows.Count; i++)
            {
                var row = NewXmlNode(xml, tab, XmlNodeType.Element, "Row");
                for (int j = 0; j < table.Rows[i].Cells.Count; j++)
                {
                    var cell = NewXmlNode(xml, row, XmlNodeType.Element, "Cell");
                    if (table.Rows[i].Cells[j].RowSpan > 1)
                    {
                        attr = xml.CreateAttribute("rowspan");
                        attr.Value = table.Rows[i].Cells[j].RowSpan.ToString();
                        cell.Attributes.Append(attr);
                    }
                    if (table.Rows[i].Cells[j].ColumnSpan > 1)
                    {
                        attr = xml.CreateAttribute("colspan");
                        attr.Value = table.Rows[i].Cells[j].ColumnSpan.ToString();
                        cell.Attributes.Append(attr);
                    }
                    WriteBlock(xml, cell, table.Rows[i].Cells[j].Blocks);
                }
            }
        }

        private static XmlNode NewXmlNode(XmlDocument xml, XmlNode parent, XmlNodeType type, string name)
        {
            XmlNode node = xml.CreateNode(type, name, null);
            parent.AppendChild(node);
            return node;
        }
    }
}

Download

Imports System
Imports System.IO
Imports SautinSoft.Document
Imports SautinSoft.Document.Tables

Namespace Example
	Friend Class Program
		Shared Sub Main(ByVal args() As String)
			SaveToXmlFile()
		End Sub
                ''' Get your free trial key here:   
                ''' https://sautinsoft.com/start-for-free/
		''' <summary>
		''' Creates a new document and saves it as Xml file.
		''' </summary>
		''' <remarks>
		''' Details: https://www.sautinsoft.com/products/document/help/net/developer-guide/save-document-as-xml-net-csharp-vb.php
		''' </remarks>
		Private Shared Sub SaveToXmlFile()
			Dim dc As New DocumentCore()
			Dim db As New DocumentBuilder(dc)

			' Create a new table with preferred width.
			Dim table As Table = db.StartTable()
			db.TableFormat.PreferredWidth = New TableWidth(LengthUnitConverter.Convert(5, LengthUnit.Inch, LengthUnit.Point), TableWidthUnit.Point)

			' Specify formatting of cells and alignment.
			db.CellFormat.Borders.SetBorders(MultipleBorderTypes.Outside, BorderStyle.Single, Color.Green, 1)
			db.CellFormat.VerticalAlignment = VerticalAlignment.Top
			db.ParagraphFormat.Alignment = HorizontalAlignment.Center

			' Specify height of rows and write text.
			db.RowFormat.Height = New TableRowHeight(105F, HeightRule.Exact)
			db.InsertCell()
			db.Write("This is Row 1 Cell 1")
			db.InsertCell()
			db.Write("This is Row 1 Cell 2")
			db.InsertCell()
			db.Write("This is Row 1 Cell 3")
			db.EndRow()

			' Specify formatting of cells and alignment.
			db.CellFormat.Borders.SetBorders(MultipleBorderTypes.Outside, BorderStyle.Single, Color.Black, 1)
			db.CellFormat.VerticalAlignment = VerticalAlignment.Center
			db.ParagraphFormat.Alignment = HorizontalAlignment.Left

			' Specify height of rows and write text.
			db.RowFormat.Height = New TableRowHeight(150F, HeightRule.Exact)
			db.InsertCell()
			db.Write("This is Row 2 Cell 1")
			db.InsertCell()
			db.Write("This is Row 2 Cell 2")
			db.InsertCell()
			db.Write("This is Row 2 Cell 3")
			db.EndRow()

			' Specify formatting of cells and alignment.
			db.CellFormat.Borders.SetBorders(MultipleBorderTypes.Outside, BorderStyle.Single, Color.Orange, 1)
			db.CellFormat.VerticalAlignment = VerticalAlignment.Bottom
			db.ParagraphFormat.Alignment = HorizontalAlignment.Right

			' Specify height of rows and write text
			db.RowFormat.Height = New TableRowHeight(125F, HeightRule.Exact)
			db.InsertCell()
			db.Write("This is Row 3 Cell 1")
			db.InsertCell()
			db.Write("This is Row 3 Cell 2")
			db.InsertCell()
			db.Write("This is Row 3 Cell 3")
			db.EndRow()
			db.EndTable()

			' Save our document into XML format.
			Dim filePath As String = "Result.xml"
			dc.Save(filePath)

			' Open the result for demonstration purposes.
			System.Diagnostics.Process.Start(New System.Diagnostics.ProcessStartInfo(filePath) With {.UseShellExecute = True})
		End Sub
	End Class
End Namespace

Download


Если вам нужен пример кода или у вас есть вопрос: напишите нам по адресу support@sautinsoft.ru или спросите в онлайн-чате (правый нижний угол этой страницы) или используйте форму ниже:



Вопросы и предложения всегда приветствуются!

Мы разрабатываем компоненты .Net с 2002 года. Мы знаем форматы PDF, DOCX, RTF, HTML, XLSX и Images. Если вам нужна помощь в создании, изменении или преобразовании документов в различных форматах, мы можем вам помочь. Мы напишем для вас любой пример кода абсолютно бесплатно.