<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=HTML_in_C-Sharp_bearbeiten_mit_AngleSharp</id>
	<title>HTML in C-Sharp bearbeiten mit AngleSharp - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=HTML_in_C-Sharp_bearbeiten_mit_AngleSharp"/>
	<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=HTML_in_C-Sharp_bearbeiten_mit_AngleSharp&amp;action=history"/>
	<updated>2026-10-17T10:12:38Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in maxTechCorner</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://techcorner.max-it.de/index.php?title=HTML_in_C-Sharp_bearbeiten_mit_AngleSharp&amp;diff=4290&amp;oldid=prev</id>
		<title>imported&gt;TechCorner-Redaktion: Neufassung von &quot;Bearbeiten von HTML in C&quot;: AngleSharp statt CsQuery, HtmlAgilityPack, Stand Oktober 2026</title>
		<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=HTML_in_C-Sharp_bearbeiten_mit_AngleSharp&amp;diff=4290&amp;oldid=prev"/>
		<updated>2026-10-14T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;Neufassung von &amp;quot;Bearbeiten von HTML in C&amp;quot;: AngleSharp statt CsQuery, HtmlAgilityPack, Stand Oktober 2026&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Steckbrief&lt;br /&gt;
| gilt_fuer   = .NET 8/10 (Codebeispiele), AngleSharp 1.x und HtmlAgilityPack auch für .NET Framework 4.6.2+&lt;br /&gt;
| bereich     = Softwareentwicklung&lt;br /&gt;
| dauer       = ca. 15 Minuten&lt;br /&gt;
| rechte      = Entwicklungsumgebung&lt;br /&gt;
| stand       = Oktober 2026&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;HTML in C# bearbeiten&amp;#039;&amp;#039;&amp;#039; – etwa Attribute entfernen, Links umschreiben oder Inhalte auslesen – gelingt zuverlässig nur mit einem echten HTML-Parser. Mit &amp;#039;&amp;#039;&amp;#039;AngleSharp&amp;#039;&amp;#039;&amp;#039; laden Sie HTML in ein DOM, wählen Elemente per CSS-Selektor aus wie in jQuery und geben das Ergebnis wieder als HTML aus.&lt;br /&gt;
&lt;br /&gt;
[[Datei:HTML-CSharp-AngleSharp.png|thumb|center|750px|HTML in C# bearbeiten: AngleSharp parst HTML in einen DOM-Baum, Elemente werden per CSS-Selektor ausgewählt und als HTML ausgegeben.]]&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
* In einem HTML-String sollen bestimmte Attribute (z. B. &amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;onclick&amp;lt;/code&amp;gt;) oder Elemente entfernt werden.&lt;br /&gt;
* Reguläre Ausdrücke versagen bei verschachteltem oder unsauberem HTML: Sie treffen zu viel, zu wenig oder zerstören das Markup.&lt;br /&gt;
&lt;br /&gt;
== Ursache ==&lt;br /&gt;
HTML ist keine reguläre Sprache – verschachtelte Tags, optionale Anführungszeichen und fehlerhaftes Markup lassen sich mit regulären Ausdrücken nicht sicher verarbeiten. Ein Parser baut dagegen wie ein Browser einen [[DOM]]-Baum auf.&lt;br /&gt;
&lt;br /&gt;
== Lösung mit AngleSharp ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dotnet add package AngleSharp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using AngleSharp.Html.Parser;&lt;br /&gt;
&lt;br /&gt;
public static class HtmlTools&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;Entfernt ein Attribut aus allen Elementen, die auf den CSS-Selektor passen.&amp;lt;/summary&amp;gt;&lt;br /&gt;
    /// &amp;lt;param name=&amp;quot;html&amp;quot;&amp;gt;HTML-Fragment oder komplettes Dokument&amp;lt;/param&amp;gt;&lt;br /&gt;
    /// &amp;lt;param name=&amp;quot;selector&amp;quot;&amp;gt;CSS-Selektor, z. B. &amp;quot;div &amp;gt; ul li:first-child&amp;quot;&amp;lt;/param&amp;gt;&lt;br /&gt;
    /// &amp;lt;param name=&amp;quot;attributeName&amp;quot;&amp;gt;Name des zu entfernenden Attributs&amp;lt;/param&amp;gt;&lt;br /&gt;
    public static string RemoveAttribute(string html, string selector, string attributeName)&lt;br /&gt;
    {&lt;br /&gt;
        ArgumentException.ThrowIfNullOrWhiteSpace(selector);&lt;br /&gt;
        ArgumentException.ThrowIfNullOrWhiteSpace(attributeName);&lt;br /&gt;
&lt;br /&gt;
        var parser = new HtmlParser();&lt;br /&gt;
        var document = parser.ParseDocument(html ?? string.Empty);&lt;br /&gt;
&lt;br /&gt;
        foreach (var element in document.QuerySelectorAll(selector))&lt;br /&gt;
            element.RemoveAttribute(attributeName);&lt;br /&gt;
&lt;br /&gt;
        return document.Body?.InnerHtml ?? string.Empty;   // Fragment zurückgeben&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Aufruf:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var cleaned = HtmlTools.RemoveAttribute(&lt;br /&gt;
    &amp;quot;&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li style=\&amp;quot;color:red\&amp;quot;&amp;gt;Eins&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Zwei&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;div &amp;gt; ul li:first-child&amp;quot;, &amp;quot;style&amp;quot;);&lt;br /&gt;
// &amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Eins&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Zwei&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;QuerySelectorAll&amp;lt;/code&amp;gt; entspricht jQuerys &amp;lt;code&amp;gt;$(selector)&amp;lt;/code&amp;gt;; für ein komplettes Dokument statt eines Fragments &amp;lt;code&amp;gt;document.DocumentElement.OuterHtml&amp;lt;/code&amp;gt; zurückgeben.&lt;br /&gt;
&lt;br /&gt;
=== Alternative: HtmlAgilityPack ===&lt;br /&gt;
Die ebenfalls verbreitete Bibliothek &amp;#039;&amp;#039;&amp;#039;HtmlAgilityPack&amp;#039;&amp;#039;&amp;#039; arbeitet mit XPath statt CSS-Selektoren und ist besonders tolerant gegenüber fehlerhaftem HTML:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var doc = new HtmlAgilityPack.HtmlDocument();&lt;br /&gt;
doc.LoadHtml(html);&lt;br /&gt;
foreach (var node in doc.DocumentNode.SelectNodes(&amp;quot;//li[@style]&amp;quot;) ?? Enumerable.Empty&amp;lt;HtmlAgilityPack.HtmlNode&amp;gt;())&lt;br /&gt;
    node.Attributes.Remove(&amp;quot;style&amp;quot;);&lt;br /&gt;
var result = doc.DocumentNode.OuterHtml;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nicht mehr verwenden:&amp;#039;&amp;#039;&amp;#039; Die früher hier vorgestellte Bibliothek &amp;#039;&amp;#039;CsQuery&amp;#039;&amp;#039; wird seit Jahren nicht mehr gepflegt und unterstützt kein modernes .NET.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sicherheit:&amp;#039;&amp;#039;&amp;#039; Zum Entschärfen von Benutzereingaben (XSS) ist das Entfernen einzelner Attribute nicht ausreichend. Dafür einen Whitelist-basierten Sanitizer wie das NuGet-Paket &amp;#039;&amp;#039;HtmlSanitizer&amp;#039;&amp;#039; (baut auf AngleSharp auf) verwenden.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Performance:&amp;#039;&amp;#039;&amp;#039; Den &amp;lt;code&amp;gt;HtmlParser&amp;lt;/code&amp;gt; bei vielen Aufrufen wiederverwenden statt jedes Mal neu zu erzeugen.&lt;br /&gt;
* Bei der Entwicklung von Web- und .NET-Anwendungen unterstützt Sie die [https://www.max-it.de/development/individuelle-softwareentwicklung/ individuelle Softwareentwicklung von m.a.x. it].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[HTML]]&lt;br /&gt;
* [[DOM]]&lt;br /&gt;
* [[HTML-Grundbefehle]]&lt;br /&gt;
* [[Lokale Funktionen in C-Sharp (Local Functions)]]&lt;br /&gt;
&lt;br /&gt;
== Links und Quellen ==&lt;br /&gt;
* [https://anglesharp.github.io/ AngleSharp – Projektseite und Dokumentation]&lt;br /&gt;
* [https://www.max-it.de/development/individuelle-softwareentwicklung/ Individuelle Softwareentwicklung von m.a.x. it]&lt;br /&gt;
&lt;br /&gt;
{{Uebermax}}&lt;br /&gt;
[[Kategorie:Softwareentwicklung]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;TechCorner-Redaktion</name></author>
	</entry>
</feed>