The magical data extractor for .NET that makes working with XML, JSON, CSV, and HTML a breeze. No tedious model creation. No parsing headaches. Just pure productivity.
// Install: dotnet add package WebSpark.Slurper
var factory = new SlurperFactory();
var extractor = factory.CreateXmlExtractor();
string xml = @"
<book id=""bk101"">
<author>Gambardella, Matthew</author>
<title>XML Developer Guide</title>
<price>44.95</price>
</book>";
var book = extractor.Extract(xml).First();
// Access data with dynamic properties - no model needed!
Console.WriteLine($"Title: {book.title}");
Console.WriteLine($"Author: {book.author}");
Console.WriteLine($"Price: ${book.price}");
A comprehensive toolkit for data extraction with enterprise-grade features
Extract data from XML, JSON, CSV, and HTML with a unified, consistent API.
Access extracted data using dynamic properties without defining model classes.
Start extracting data immediately with sensible defaults and no setup required.
All extraction methods have asynchronous versions for non-blocking operations.
Full integration with .NET DI container for clean architecture.
Plugin system allows you to add custom data extractors for any format.
Streaming, parallel processing, and caching options for optimal performance.
Comprehensive exception types with detailed messages for easy debugging.
Easily serialize extracted data back to JSON with envelope support.
Three simple steps to start extracting data
Add WebSpark.Slurper to your project using the .NET CLI or Package Manager.
dotnet add package WebSpark.Slurper
Use the factory to create an extractor for your data format.
var factory = new SlurperFactory();
var extractor = factory.CreateJsonExtractor();
Extract from strings, files, or URLs and access data dynamically.
var data = extractor.Extract(jsonString);
Console.WriteLine(data.First().propertyName);
See how Slurper handles different data formats with ease
// Create factory and extractor
var factory = new SlurperFactory();
var xmlExtractor = factory.CreateXmlExtractor();
// Extract from string
string xml = @"
<catalog>
<book id=""bk101"">
<author>Gambardella, Matthew</author>
<title>XML Developer Guide</title>
<price>44.95</price>
</book>
<book id=""bk102"">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<price>5.95</price>
</book>
</catalog>";
var catalog = xmlExtractor.Extract(xml).First();
// Access data dynamically - bookList is created automatically!
foreach (var book in catalog.bookList)
{
Console.WriteLine($"Title: {book.title}");
Console.WriteLine($"Author: {book.author}");
Console.WriteLine($"Price: ${book.price}");
Console.WriteLine($"ID: {book.id}"); // Attributes too!
Console.WriteLine();
}
// Extract from file or URL
var booksFromFile = xmlExtractor.ExtractFromFile("books.xml");
var booksFromUrl = await xmlExtractor.ExtractFromUrlAsync("https://api.example.com/books.xml");
// Create factory and extractor
var factory = new SlurperFactory();
var jsonExtractor = factory.CreateJsonExtractor();
// Extract from JSON string
string json = @"{
""users"": [
{
""id"": 1,
""name"": ""John Doe"",
""email"": ""john@example.com"",
""active"": true
},
{
""id"": 2,
""name"": ""Jane Smith"",
""email"": ""jane@example.com"",
""active"": false
}
]
}";
var data = jsonExtractor.Extract(json).First();
// Navigate nested structures naturally
foreach (var user in data.users.usersList)
{
Console.WriteLine($"User #{user.id}: {user.name}");
Console.WriteLine($"Email: {user.email}");
Console.WriteLine($"Status: {(user.active ? ""Active"" : ""Inactive"")}");
Console.WriteLine();
}
// Serialize back to JSON
string outputJson = data.ToJson(indented: true);
// Create envelope with metadata
var metadata = new Dictionary<string, object>
{
{ ""timestamp"", DateTime.UtcNow },
{ ""version"", ""1.0"" }
};
string envelope = data.ToJsonEnvelope(""response"", metadata, indented: true);
// Create factory and extractor
var factory = new SlurperFactory();
var csvExtractor = factory.CreateCsvExtractor();
// Extract from CSV string
string csv = @"id,name,department,salary
101,John Doe,Engineering,95000
102,Jane Smith,Marketing,87000
103,Bob Johnson,Engineering,92000
104,Alice Williams,Sales,78000";
var employees = csvExtractor.Extract(csv);
// Access CSV data as dynamic objects
foreach (var employee in employees)
{
Console.WriteLine($"ID: {employee.id}");
Console.WriteLine($"Name: {employee.name}");
Console.WriteLine($"Department: {employee.department}");
Console.WriteLine($"Salary: ${employee.salary:N0}");
Console.WriteLine();
}
// Extract from file
var employeesFromFile = csvExtractor.ExtractFromFile("employees.csv");
// Extract from URL
var employeesFromUrl = await csvExtractor.ExtractFromUrlAsync(
"https://example.com/data/employees.csv"
);
// Create factory and extractor
var factory = new SlurperFactory();
var htmlExtractor = factory.CreateHtmlExtractor();
// Extract from HTML string
string html = @"
<html>
<body>
<article class=""product"">
<h1>Wireless Headphones</h1>
<p class=""price"">$129.99</p>
<div class=""description"">
Premium sound quality with noise cancellation
</div>
</article>
</body>
</html>";
var page = htmlExtractor.Extract(html).First();
// Navigate HTML structure
Console.WriteLine($"Product: {page.html.body.article.h1}");
Console.WriteLine($"Price: {page.html.body.article.p}");
Console.WriteLine($"Description: {page.html.body.article.div}");
// Extract from URL
var webPage = await htmlExtractor.ExtractFromUrlAsync("https://example.com/product");
// Perfect for web scraping
Console.WriteLine($"Title: {webPage.First().html.body.h1}");
// In Program.cs or Startup.cs
using WebSpark.Slurper.Extensions;
var builder = WebApplication.CreateBuilder(args);
// Register all Slurper services
builder.Services.AddSlurper();
var app = builder.Build();
// In your service class
public class DataService
{
private readonly IXmlExtractor _xmlExtractor;
private readonly IJsonExtractor _jsonExtractor;
private readonly ICsvExtractor _csvExtractor;
private readonly IHttpClientService _httpClient;
private readonly ILogger<DataService> _logger;
public DataService(
IXmlExtractor xmlExtractor,
IJsonExtractor jsonExtractor,
ICsvExtractor csvExtractor,
IHttpClientService httpClient,
ILogger<DataService> logger)
{
_xmlExtractor = xmlExtractor;
_jsonExtractor = jsonExtractor;
_csvExtractor = csvExtractor;
_httpClient = httpClient;
_logger = logger;
}
public async Task<IEnumerable<dynamic>> GetProductsAsync(string url, string format)
{
_logger.LogInformation($"Fetching products from {url} in {format} format");
return format.ToLower() switch
{
"xml" => await _xmlExtractor.ExtractFromUrlAsync(url),
"json" => await _jsonExtractor.ExtractFromUrlAsync(url),
"csv" => await _csvExtractor.ExtractFromUrlAsync(url),
_ => throw new NotSupportedException($"Format {format} not supported")
};
}
}
Track the evolution of WebSpark.Slurper
Everything you need to master WebSpark.Slurper
Join thousands of developers who are already using WebSpark.Slurper to simplify their data extraction.