How to Modify SVG Styles Programmatically in C#

This article focuses exclusively on how to programmatically rewrite and normalize SVG styles at the DOM level using C#.

Why SVG Style Normalization Is Required

In real-world workflows, SVG files are rarely authored for programmatic processing. They are typically produced by design tools, third-party services, or user uploads and contain a mix of styling mechanisms:

These mechanisms do not have equal priority. If this is not taken into account, programmatic style changes may appear to not work even though the code executes correctly. Before changing anything, it is crucial to understand where styles come from and which ones take precedence. If you’re not familiar with SVG styling models, see SVG Styles in Aspose.SVG: CSS vs Inline vs Attributes.

This article focuses only on DOM-level style modification using C# and Aspose.SVG. We assume you already understand why SVG styling conflicts occur – that topic is covered in related articles:

Inspect SVG and Find Elements with Inline Styles

If an SVG element has an inline style attribute, changing CSS rules or presentation attributes will not affect rendering. Therefore, every style change process should begin by checking inline styles. Using Aspose, you can inspect your document and identify where inline styles are used to inform your future strategy for changing and applying styles.

Example: Detect Inline Style Attributes in an SVG Document

1using Aspose.Svg.Dom;
2using System.IO;
 1// Find and inspect SVG elements that use inline style attributes with Aspose.SVG for .NET
 2
 3SVGDocument document = new SVGDocument(Path.Combine(DataDir, "shapes.svg"));
 4
 5// Select all elements that have inline style attributes
 6var styledNodes = document.QuerySelectorAll("[style]");
 7
 8Console.WriteLine($"Found {styledNodes.Length} element(s) with inline styles:\n");
 9
10foreach (var node in styledNodes)
11{
12    var element = (Element)node;
13
14    // Get and display the style attribute value
15    string styleValue = element.GetAttribute("style");
16    Console.WriteLine($"Element: <{element.TagName}>");
17    Console.WriteLine($"Style: {styleValue}\n");
18}            

After running the example, you will gain information about all inline style attributes and decide how to modify a particular element’s style to avoid conflicts.

1    Element: <line>
2    Style: stroke:grey; stroke-width:5
3
4    Element: <polygon>
5    Style: fill:orange; stroke:purple; stroke-width:1; fill-opacity:1
6
7    Element: <ellipse>
8    Style: fill:orangered

Why this matters

  • Inline style attributes override all other styling mechanisms.
  • Design tools like Illustrator and Figma typically export SVGs with inline style attributes.
  • Ignoring this step leads to “why didn’t my change apply?” bugs.

Strategy A: Rewrite Inline Styles Selectively

When to Preserve Inline Styles

Avoid removing all inline styles when:

Instead of deleting inline style attributes blindly, you can read, modify, and rewrite them. To modify inline styles safely, you must:

This approach ensures predictable rendering by eliminating style conflicts and centralizing visual properties.

Example: Remove Only Blocking Style Properties from Inline Styles

The following C# example shows how to normalize SVG styles. It finds all elements with inline styles using QuerySelectorAll, removes the fill property from their style attribute, and sets a consistent fill color using the fill presentation attribute instead.

1using Aspose.Svg.Dom;
2using System.IO;
3using System;
4using System.Collections.Generic;
 1// Safely remove specific inline CSS properties and replace them with SVG attributes using Aspose.SVG for .NET
 2
 3SVGDocument document = new SVGDocument(Path.Combine(DataDir, "input.svg"));
 4
 5// Select elements that contain inline styles
 6var nodes = document.QuerySelectorAll("[style]");
 7foreach (var node in nodes)
 8{
 9    var element = (Element)node;
10    // Read inline style as plain text
11    var style = element.GetAttribute("style");
12    if (string.IsNullOrEmpty(style))
13        continue;
14    // Remove only fill-related declarations
15    var cleanedStyle = RemoveStyleProperty(style, "fill");
16    if (string.IsNullOrWhiteSpace(cleanedStyle))
17    {
18        // Remove empty style attribute
19        element.RemoveAttribute("style");
20    }
21    else
22    {
23        element.SetAttribute("style", cleanedStyle);
24    }
25    // Apply deterministic presentation attribute
26    element.SetAttribute("fill", "#FF7A00");
27}
28// Save the modified SVG document
29document.Save(Path.Combine(OutputDir, "style-normalized.svg"));
30
31// --- Helper method ---
32static string RemoveStyleProperty(string style, string property)
33{
34    var declarations = style.Split(';');
35    var result = new List<string>();
36    foreach (var decl in declarations)
37    {
38        if (!decl.TrimStart().StartsWith(property + ":", StringComparison.OrdinalIgnoreCase))
39        {
40            result.Add(decl.Trim());
41        }
42    }
43    return string.Join("; ", result);
44}

Strategy B: Remove Inline Style Attributes Completely

Complete removal of inline styles is appropriate in specific scenarios, but should be used with caution.

When to Remove All Inline Styles

However, complete style removal carries significant risks. Elements may revert to their default appearance with black fill and default fonts; layouts can break due to lost positioning, transforms, or opacity settings; and these changes are irreversible. Therefore, always inspect the document structure and ensure alternative styling is in place before proceeding.

Best practice: Always inspect the document structure before bulk style removal, and ensure alternative styling is in place.

Example: Remove All Inline style Attributes from SVG Elements

The following C# example shows how to remove all inline style attributes in SVG document:

1using Aspose.Svg.Dom;
2using System.IO;
 1// Remove all inline style attributes from an SVG to prevent CSS conflicts
 2
 3// Load an existing SVG document
 4SVGDocument document = new SVGDocument(Path.Combine(DataDir, "text.svg"));
 5
 6// Select all elements that have inline style attributes
 7var nodes = document.QuerySelectorAll("[style]");
 8
 9// Iterate through all styled elements
10foreach (var node in nodes)
11{
12    // Cast node to Element and remove the style attribute
13    if (node is Element element)
14    {
15        element.RemoveAttribute("style");
16    }
17}
18
19// Save the modified SVG document without inline styles
20document.Save(Path.Combine(OutputDir, "inline-styles-removed.svg"));

This creates a clean baseline for CSS rules, presentation attributes, and external styling logic.

Strategy C: Replace Inline Styles with Global <style> Element

This example demonstrates a common SVG normalization workflow: removing scattered inline styles and replacing them with centralized CSS rules. This approach improves maintainability, reduces file size, and ensures consistent styling across all text elements.

Example: Apply Global CSS Rules After Normalization

1using Aspose.Svg.Dom.Svg;
2using System.IO;
 1// Apply global CSS styles to SVG text elements after removing conflicting inline styles using Aspose.SVG for .NET
 2
 3// Load SVG document
 4using (SVGDocument document = new SVGDocument(Path.Combine(DataDir, "text.svg")))
 5{
 6    // Select all text-related elements
 7    var textNodes = document.QuerySelectorAll("text, tspan");
 8
 9    // Remove inline style attributes
10    for (int i = 0; i < textNodes.Length; i++)
11    {
12        Element element = textNodes[i] as Element;
13        if (element != null && element.HasAttribute("style"))
14        {
15            element.RemoveAttribute("style");
16        }
17    }
18
19    // Create global <style> element
20    SVGStyleElement style = (SVGStyleElement)document.CreateElementNS("http://www.w3.org/2000/svg", "style");
21    style.SetAttribute("type", "text/css");
22    style.TextContent =
23        "text { " +
24        "font-family: 'DejaVu Sans', sans-serif; " +
25        "font-size: 16px; " +
26        "fill: #2c3e50; " +
27        "}";
28
29    // Insert style at the top of SVG
30    SVGSVGElement root = document.RootElement;
31    root.InsertBefore(style, root.FirstChild);
32
33    // Save result
34    document.Save(Path.Combine(OutputDir, "styled-text.svg"));
35}

The example uses QuerySelectorAll to target all text-related elements, removes their inline styles, and inserts a global style rule at the beginning of the document using InsertBefore.

Choose the appropriate strategy based on your workflow:

  • Use Strategy A if you need to preserve most existing styling.
  • Use Strategy B when cleaning uncontrolled or generated SVG files.
  • Use Strategy C when enforcing consistent, centralized styling.

Final Workflow Summary

A reliable SVG style modification pipeline always follows this order:

  1. Inspect inline styles
  2. Normalize or remove blocking declarations
  3. Apply presentation attributes or CSS rules
  4. Export with predictable results

Skipping these steps causes unpredictable rendering results and debugging dead ends.

Close
Loading

Analyzing your prompt, please hold on...

An error occurred while retrieving the results. Please refresh the page and try again.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.