Как создать документ OpenOffice в .NET - PullRequest
3 голосов
/ 16 февраля 2010

Я начинаю писать приложение, которое будет выводить документ OpenOffice. Файл content.xml в пустом документе ODT начинается:

<?xml version="1.0" encoding="UTF-8"?>
<office:document-content
    xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
    xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
    xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
    xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
    xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
    xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
    xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
    xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
    xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
    xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
    xmlns:math="http://www.w3.org/1998/Math/MathML"
    xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
    xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
    xmlns:ooo="http://openoffice.org/2004/office"
    xmlns:ooow="http://openoffice.org/2004/writer"
    xmlns:oooc="http://openoffice.org/2004/calc"
    xmlns:dom="http://www.w3.org/2001/xml-events"
    xmlns:xforms="http://www.w3.org/2002/xforms"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:rpt="http://openoffice.org/2005/report"
    xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2"
    xmlns:rdfa="http://docs.oasis-open.org/opendocument/meta/rdfa#"
    xmlns:
        field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0"
    office:version="1.2">

Я не видел двоеточий в XML раньше. Я понимаю, что они обозначают пространства имен. Как мне воссоздать это в .NET?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2010

OpenOffice включает сборки .NET для работы с документами OpenOffice. Вы должны использовать их вместо непосредственной работы с XML. Это будет намного проще и менее подвержено ошибкам.

http://opendocument4all.com/content/view/68/47/

0 голосов
/ 16 февраля 2010

Следующий код загрузит все нужные пространства имен в менеджер пространства имен и создаст образец документа. .NET будет выводить только те пространства имен, которые фактически используются в документе, но не все. Я не уверен, есть ли способ форсировать вывод неиспользуемых, но неиспользованные действительно не нужны.

public static void Test()
{
    var nt = new NameTable();
    var ns = new XmlNamespaceManager(nt);
    var doc = new XmlDocument(nt);

    ns.AddNamespace("office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0");
    ns.AddNamespace("style", "urn:oasis:names:tc:opendocument:xmlns:style:1.0");
    ns.AddNamespace("text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0");
    ns.AddNamespace("table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0");
    ns.AddNamespace("draw", "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0");
    ns.AddNamespace("fo", "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0");
    ns.AddNamespace("xlink", "http://www.w3.org/1999/xlink");
    ns.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");
    ns.AddNamespace("meta", "urn:oasis:names:tc:opendocument:xmlns:meta:1.0");
    ns.AddNamespace("number", "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0");
    ns.AddNamespace("svg", "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0");
    ns.AddNamespace("chart", "urn:oasis:names:tc:opendocument:xmlns:chart:1.0");
    ns.AddNamespace("dr3d", "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0");
    ns.AddNamespace("math", "http://www.w3.org/1998/Math/MathML");
    ns.AddNamespace("form", "urn:oasis:names:tc:opendocument:xmlns:form:1.0");
    ns.AddNamespace("script", "urn:oasis:names:tc:opendocument:xmlns:script:1.0");
    ns.AddNamespace("ooo", "http://openoffice.org/2004/office");
    ns.AddNamespace("ooow", "http://openoffice.org/2004/writer");
    ns.AddNamespace("oooc", "http://openoffice.org/2004/calc");
    ns.AddNamespace("dom", "http://www.w3.org/2001/xml-events");
    ns.AddNamespace("xforms", "http://www.w3.org/2002/xforms");
    ns.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");
    ns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    ns.AddNamespace("rpt", "http://openoffice.org/2005/report");
    ns.AddNamespace("of", "urn:oasis:names:tc:opendocument:xmlns:of:1.2");
    ns.AddNamespace("rdfa", "http://docs.oasis-open.org/opendocument/meta/rdfa#");
    ns.AddNamespace("field", "urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0");

    var root = doc.CreateElement("office", "document-content");
    var attr = doc.CreateAttribute("office", "version", ns.LookupNamespace("office"));
    attr.Value = "1.2";
    root.Attributes.Append(attr);
    doc.AppendChild(root);

    using (var xw = new XmlTextWriter(Console.Out))
    {
        xw.Formatting = Formatting.Indented;
        xw.Indentation = 2;
        xw.IndentChar = ' ';

        doc.WriteTo(xw);
    }
}
...