HTML-Dokument speichern – C#-Beispiele

Nachdem Sie eine bestehende Datei heruntergeladen oder ein HTML-Dokument von Grund auf neu erstellt haben, können Sie die Änderungen mit einer der Methoden HTMLDocument.Save() speichern. Es gibt überladene Methoden zum Speichern eines Dokuments in einer Datei, einer URL oder in Streams.

Bitte beachten Sie, dass wir zwei verschiedene Konzepte für die Erstellung der Ausgabedateien haben:

  • Das erste Konzept basiert auf der Erzeugung von HTML-ähnlichen Dateien als Ausgabe. Die Klasse SaveOptions als Basisklasse für dieses Konzept hilft bei der Handhabung des Speichervorgangs von zugehörigen Ressourcen wie Skripten, Stilen, Bildern usw. Die Klasse ResourceHandler ist für die Handhabung von Ressourcen zuständig. Sie wurde entwickelt, um HTML-Inhalte und Ressourcen in Streams zu speichern, und bietet Methoden, mit denen Sie steuern können, was mit der Ressource geschehen soll.
  • Das zweite Konzept könnte dazu verwendet werden, eine visuelle Darstellung von HTML als Ergebnis zu erstellen. Die Basisklasse für dieses Konzept ist RenderingOptions; sie verfügt über spezialisierte Methoden zur Angabe von Seitengröße, Seitenrändern, Auflösung, Benutzerstilen usw.

Dieser Artikel beschreibt nur, wie die Klassen SaveOptions und ResourceHandler verwendet werden. Um mehr über den Rendering-Mechanismus zu erfahren, lesen Sie bitte die Artikel Renderers und Rendering Options.

SaveOptions & ResourceHandlingOptions

Die Klasse SaveOptions ist eine Basisklasse, die es Ihnen ermöglicht, zusätzliche Optionen für Speichervorgänge festzulegen, und die bei der Verwaltung der verknüpften Ressourcen hilft. Die Eigenschaft ResourceHandlingOptions der Klasse SaveOptions dient zur Konfiguration der Ressourcenbehandlung. Die Klasse ResourceHandlingOptions stellt die Optionen für die Ressourcenbehandlung dar, und die Liste der verfügbaren Optionen ist in der folgenden Tabelle aufgeführt:

OptionDescription
UrlRestrictionApplies restrictions to the host or folders where resources are located.
MaxHandlingDepthIf you need to save not the only specified HTML document, but also the linked HTML pages, this option gives you the ability to control the depth of the linked pages that should be saved.
JavaScriptThis option specifies how do we need to treat the JavaScript files: it could be saved as a separated linked file, embed into HTML file or even be ignored.
DefaultThis option specifies behavior for other than JavaScript files. Gets or sets an enum, which represents the default way of resource handling. Currently, Save, Ignore, and Embed values are supported. The default value is Save.

HTML speichern

Wenn Sie Ihre Änderungen in HTML abgeschlossen haben, möchten Sie das Dokument vielleicht speichern. Dazu können Sie eine der Save() Methoden der HTMLDocument Klasse verwenden. Das folgende Beispiel ist der einfachste Weg, eine HTML-Datei zu speichern:

 1// Save HTML to a file using C#
 2
 3// Prepare an output path for a document saving
 4string documentPath = Path.Combine(OutputDir, "save-to-file.html");
 5
 6// Initialize an empty HTML document
 7using (HTMLDocument document = new HTMLDocument())
 8{
 9    // Create a text element and add it to the document
10    Text text = document.CreateTextNode("Hello, World!");
11    document.Body.AppendChild(text);
12
13    // Save the HTML document to the file on a disk
14    document.Save(documentPath);
15}

Im obigen Beispiel verwenden wir den HTMLDocument()-Konstruktor, um ein leeres HTML-Dokument zu initialisieren. Die Methode CreateTextNode(data) der Klasse HTMLDocument erzeugt einen Textknoten mit der angegebenen Zeichenkette. Die Methode Save(path) speichert das Dokument in einer lokalen Datei, die durch den Pfad angegeben wird.

Das obige Beispiel ist recht einfach. In realen Anwendungen benötigen Sie jedoch oft zusätzliche Kontrolle über den Speichervorgang. In den nächsten Abschnitten wird beschrieben, wie Sie die Optionen zur Ressourcenbehandlung verwenden oder Ihr Dokument in den verschiedenen Formaten speichern können.

HTML in einer Datei speichern

Der folgende Codeschnipsel zeigt, wie Sie die Eigenschaft ResourceHandlingOptions der Klasse SaveOptions verwenden, um die Verknüpfung mit Ihren Dokumentdateien zu verwalten.

 1// Save HTML with a linked resources using C#
 2
 3// Prepare an output path for an HTML document 
 4string documentPath = Path.Combine(OutputDir, "save-with-linked-file.html");
 5
 6// Prepare a simple HTML file with a linked document
 7File.WriteAllText(documentPath, "<p>Hello, World!</p>" +
 8                                "<a href='linked.html'>linked file</a>");
 9
10// Prepare a simple linked HTML file
11File.WriteAllText(Path.Combine(OutputDir, "linked.html"), "<p>Hello, linked file!</p>");
12
13// Load the "save-with-linked-file.html" into memory
14using (HTMLDocument document = new HTMLDocument(documentPath))
15{
16    // Create a save options instance
17    HTMLSaveOptions options = new HTMLSaveOptions();
18
19    // The following line with value '0' cuts off all other linked HTML-files while saving this instance
20    // If you remove this line or change value to the '1', the 'linked.html' file will be saved as well to the output folder
21    options.ResourceHandlingOptions.MaxHandlingDepth = 1;
22
23    // Save the document with the save options
24    document.Save(Path.Combine(OutputDir, "save-with-linked-file_out.html"), options);
25}

Speichern von HTML in einem lokalen Dateisystemspeicher

Das HTML-Dokument kann verschiedene Ressourcen wie CSS, externe Bilder und Dateien enthalten. Aspose.HTML for .NET bietet eine Möglichkeit, HTML mit allen verknüpften Dateien zu speichern – die Klasse ResourceHandler wurde entwickelt, um HTML-Inhalte und Ressourcen in Streams zu speichern. Diese Klasse ist für die Behandlung von Ressourcen zuständig und bietet Methoden, mit denen Sie steuern können, was mit jeder Ressource geschieht.

Betrachten wir ein Beispiel für das Speichern von HTML mit Ressourcen in einem benutzerdefinierten lokalen Dateispeicher. Das Quelldokument with-resources.html und die damit verknüpfte Bilddatei befinden sich im selben Verzeichnis. Der FileSystemResourceHandler(customOutDir) Konstruktor nimmt einen Pfad, der angibt, wo das Dokument mit Ressourcen gespeichert werden soll und erzeugt ein FileSystemResourceHandler Objekt. Die Methode Save(resourceHandler) nimmt dieses Objekt und speichert HTML in den Ausgabespeicher.

 1// Save HTML with resources to local storage using C#
 2
 3// Prepare a path to a source HTML file
 4string inputPath = Path.Combine(DataDir, "with-resources.html");
 5
 6// Prepare a full path to an output directory 
 7string customOutDir = Path.Combine(Directory.GetCurrentDirectory(), "./../../../../tests-out/saving/");
 8
 9// Load the HTML document from a file
10using (HTMLDocument doc = new HTMLDocument(inputPath))
11{
12    // Save HTML with resources
13    doc.Save(new FileSystemResourceHandler(customOutDir));
14}

HTML in einem Zip-Archiv speichern

Sie können den ResourceHandler implementieren, indem Sie die Klasse ZipResourceHandler erstellen. Sie ermöglicht es Ihnen, ein strukturiertes und komprimiertes Archiv zu erstellen, das HTML-Dokumente und zugehörige Ressourcen enthält, und eignet sich damit für Szenarien wie Archivierung und Speicheroptimierung. Die Methode HandleResource() in der Klasse ZipResourceHandler dient zur Anpassung des Verhaltens, wie einzelne Ressourcen in einem Zip-Archiv verarbeitet und gespeichert werden.

Im folgenden Beispiel wird die Klasse ZipResourceHandler verwendet, um das Dokument with-resources.html zusammen mit seinen verknüpften Ressourcen in einem Zip-Archiv zu speichern:

 1// Save an HTML document with all linked resources into a ZIP archive using C#
 2
 3// Prepare a path to a source HTML file 
 4string inputPath = Path.Combine(DataDir, "with-resources.html");
 5
 6string dir = Directory.GetCurrentDirectory();
 7
 8// Prepare a full path to an output zip storage
 9string customArchivePath = Path.Combine(dir, "./../../../../tests-out/saving/archive.zip");
10
11// Load the HTML document 
12using (HTMLDocument doc = new HTMLDocument(inputPath))
13{
14    // Initialize an instance of the ZipResourceHandler class
15    using (ZipResourceHandler resourceHandler = new ZipResourceHandler(customArchivePath))
16    {
17        // Save HTML with resources to a Zip archive
18        doc.Save(resourceHandler);
19    }
20}

Die Klasse ResourceHandler ist für die Implementierung durch den Kunden gedacht. Die Klasse ZipResourceHandler erweitert die Basisklasse ResourceHandler und bietet eine bequeme Möglichkeit, den gesamten Prozess der Handhabung und Speicherung von mit einem HTML-Dokument verknüpften Ressourcen in einem Zip-Archiv zu verwalten:

 1// Custom resource handler to save HTML with resources into a ZIP archive
 2
 3internal class ZipResourceHandler : ResourceHandler, IDisposable
 4{
 5    private FileStream zipStream;
 6    private ZipArchive archive;
 7    private int streamsCounter;
 8    private bool initialized;
 9
10    public ZipResourceHandler(string name)
11    {
12        DisposeArchive();
13        zipStream = new FileStream(name, FileMode.Create);
14        archive = new ZipArchive(zipStream, ZipArchiveMode.Update);
15        initialized = false;
16    }
17
18    public override void HandleResource(Resource resource, ResourceHandlingContext context)
19    {
20        string zipUri = (streamsCounter++ == 0
21            ? Path.GetFileName(resource.OriginalUrl.Href)
22            : Path.Combine(Path.GetFileName(Path.GetDirectoryName(resource.OriginalUrl.Href)),
23                Path.GetFileName(resource.OriginalUrl.Href)));
24        string samplePrefix = String.Empty;
25        if (initialized)
26            samplePrefix = "my_";
27        else
28            initialized = true;
29
30        using (Stream newStream = archive.CreateEntry(samplePrefix + zipUri).Open())
31        {
32            resource.WithOutputUrl(new Url("file:///" + samplePrefix + zipUri)).Save(newStream, context);
33        }
34    }
35
36    private void DisposeArchive()
37    {
38        if (archive != null)
39        {
40            archive.Dispose();
41            archive = null;
42        }
43
44        if (zipStream != null)
45        {
46            zipStream.Dispose();
47            zipStream = null;
48        }
49
50        streamsCounter = 0;
51    }
52
53    public void Dispose()
54    {
55        DisposeArchive();
56    }
57}

HTML in Memory Streams speichern

Die Implementierung der Klasse ResourceHandler in der Klasse MemoryResourceHandler ermöglicht das Speichern von HTML in Memory Streams. Der folgende Code zeigt, wie die Klasse MemoryResourceHandler verwendet wird, um ein HTML-Dokument im Speicher zu speichern und Informationen über die behandelten Ressourcen zu sammeln und auszudrucken.

  1. Initialisieren Sie ein HTML-Dokument mit dem angegebenen HTML-Dateipfad.
  2. Erstellen Sie eine Instanz der Klasse MemoryResourceHandler. Diese Klasse wurde entwickelt, um Ressourcen in Speicherströmen während des Prozesses der Ressourcenbehandlung zu erfassen und zu speichern.
  3. Rufen Sie die Methode Save() des HTML-Dokuments auf und übergeben Sie ihr die Instanz MemoryResourceHandler als Argument. Dadurch wird die Logik der Ressourcenbehandlung des MemoryResourceHandler mit dem Speichervorgang des HTML-Dokuments verbunden.
  4. Verwenden Sie die Methode PrintInfo() des MemoryResourceHandler, um Informationen über die behandelten Ressourcen zu drucken.
 1// Save HTML with resources to memory streams using C#
 2
 3// Prepare a path to a source HTML file 
 4string inputPath = Path.Combine(DataDir, "with-resources.html");
 5
 6// Load the HTML document 
 7using (HTMLDocument doc = new HTMLDocument(inputPath))
 8{
 9    // Create an instance of the MemoryResourceHandler class and save HTML to memory
10    MemoryResourceHandler resourceHandler = new MemoryResourceHandler();
11    doc.Save(resourceHandler);
12    resourceHandler.PrintInfo();
13}

Nach dem Ausführen des Beispiels wird die Meldung über die Speicherung des Speichers gedruckt:

uri:memory:///with-resources.html, length:256
uri:memory:///photo1.png, length:57438

Der ResourceHandler ist eine Basisklasse, die die Erstellung und Verwaltung von Ausgabeströmen unterstützt. Die Klasse MemoryResourceHandler ermöglicht es, Ressourcen in Speicherströmen zu erfassen und zu speichern und bietet damit eine dynamische und flexible Möglichkeit, Ressourcen zu handhaben, ohne sie physisch im Dateisystem zu speichern. Der folgende Codeschnipsel zeigt die Realisierung des ResourceHandlers in der MemoryResourceHandler Klasse:

 1// In-memory resource handler that captures and stores HTML resources as streams
 2
 3internal class MemoryResourceHandler : ResourceHandler
 4{
 5    public List<Tuple<Stream, Resource>> Streams;
 6
 7    public MemoryResourceHandler()
 8    {
 9        Streams = new List<Tuple<Stream, Resource>>();
10    }
11
12    public override void HandleResource(Resource resource, ResourceHandlingContext context)
13    {
14        MemoryStream outputStream = new MemoryStream();
15        Streams.Add(Tuple.Create<Stream, Resource>(outputStream, resource));
16        resource
17            .WithOutputUrl(new Url(Path.GetFileName(resource.OriginalUrl.Pathname), "memory:///"))
18            .Save(outputStream, context);
19    }
20
21    public void PrintInfo()
22    {
23        foreach (Tuple<Stream, Resource> stream in Streams)
24            Console.WriteLine($"uri:{stream.Item2.OutputUrl}, length:{stream.Item1.Length}");
25    }
26}

HTML in MHTML speichern

In manchen Fällen müssen Sie Ihre Webseite als eine einzige Datei speichern. Das Dokument MHTML könnte für diesen Zweck praktisch und hilfreich sein, da es ein Webseitenarchiv ist und alles in sich selbst speichert. Die Aufzählung HTMLSaveFormat gibt das Format an, in dem das Dokument gespeichert wird, es können die Formate HTML, MHTML und MD sein. Das folgende Beispiel zeigt, wie die Methode Save(path, saveFormat) zum Speichern von HTML in MHTML verwendet werden kann.

 1// Save HTML as MHTML using C#
 2
 3// Prepare an output path for a document saving
 4string savePath = Path.Combine(OutputDir, "save-to-mhtml.mht");
 5
 6// Prepare a simple HTML file with a linked document
 7File.WriteAllText("save-to-mhtml.html", "<p>Hello, World!</p>" +
 8                                        "<a href='linked-file.html'>linked file</a>");
 9
10// Prepare a simple linked HTML file
11File.WriteAllText("linked-file.html", "<p>Hello, linked file!</p>");
12
13// Load the "save-to-mhtml.html" into memory
14using (HTMLDocument document = new HTMLDocument("save-to-mhtml.html"))
15{
16    // Save the document to MHTML format
17    document.Save(savePath, HTMLSaveFormat.MHTML);
18}

Die gespeicherte Datei “save-to-mhtml.mht” speichert HTML der Dateien “document.html” und “linked-file.html”.

HTML in Markdown speichern

Markdown ist eine Auszeichnungssprache mit Klartext-Syntax. Genauso wie für das Beispiel HTML zu MHTML, können Sie das HTMLSaveFormat für das Speichern von HTML zu MD verwenden. Bitte sehen Sie sich das folgende Beispiel an:

 1// Save HTML as Markdown using C#
 2
 3// Prepare an output path for a document saving
 4string documentPath = Path.Combine(OutputDir, "save-html-to-markdown.md");
 5
 6// Prepare HTML code
 7string html_code = "<H2>Hello, World!</H2>";
 8
 9// Initialize a document from a string variable
10using (HTMLDocument document = new HTMLDocument(html_code, "."))
11{
12    // Save the document as a Markdown file
13    document.Save(documentPath, HTMLSaveFormat.Markdown);
14}

Weitere Informationen zur Verwendung des HTML-Konverters finden Sie in dem Artikel HTML in Markdown umwandeln.

SVG speichern

Normalerweise sieht man SVG als Teil einer HTML-Datei. Es wird verwendet, um die Vektordaten auf der Seite darzustellen: Bilder, Icons, Tabellen, usw. SVG kann jedoch auch aus der Webseite extrahiert werden und lässt sich dann auf ähnliche Weise wie ein HTML-Dokument manipulieren.

Da SVGDocument und HTMLDocument auf demselben WHATWG DOM Standard beruhen, sind alle Vorgänge wie Laden, Lesen, Bearbeiten, Konvertieren und Speichern für beide Dokumente ähnlich. Daher sind alle Beispiele, in denen Sie Manipulationen mit dem HTMLDocument sehen können, auch für das SVGDocument anwendbar.

Um Ihre Änderungen zu speichern, gehen Sie bitte wie folgt vor:

 1// Create and save SVG image using C#
 2
 3// Prepare an output path for a document saving
 4string documentPath = Path.Combine(OutputDir, "create-and-save-svg.svg");
 5
 6// Prepare SVG code
 7string code = @"
 8    <svg xmlns='http://www.w3.org/2000/svg' height='200' width='300'>
 9        <g fill='none' stroke-width= '10' stroke-dasharray='30 10'>
10            <path stroke='red' d='M 25 40 l 215 0' />
11            <path stroke='black' d='M 35 80 l 215 0' />
12            <path stroke='blue' d='M 45 120 l 215 0' />
13        </g>
14    </svg>";
15
16// Initialize an SVG instance from the content string
17using (SVGDocument document = new SVGDocument(code, "."))
18{
19    // Save the SVG file to a disk
20    document.Save(documentPath);
21}

Weitere Informationen über SVG Basics Drawing und die API-Nutzung für die Verarbeitung und das Rendering von SVG-Dokumenten finden Sie in der Aspose.SVG for .NET Dokumentation.

Sie können die vollständigen Beispiele und Datendateien von GitHub herunterladen.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.