Skip to content

Migrating to v2

v2 replaces the old reader-only API with a typed document model, explicit reader options, explicit read filters, and XMLTV date/time values.

Package Install

The package name is unchanged:

bash
dotnet add package XmlTvSharp

Reading a Complete File

v1 used ReadAllAsync:

csharp
var settings = new XmlTvReaderSettings();
var result = await XmlTvReader.ReadAllAsync(xmlFilePath, settings, cancellationToken);

v2 uses ReadAsync:

csharp
var options = new XmlTvReaderOptions();
XmlTvDocument document = await XmlTvReader.ReadAsync("guide.xml", options, cancellationToken);

The result is now an XmlTvDocument with Metadata, Channels, and Programmes.

Reading One Element at a Time

v1 used ReadAsync on the reader:

csharp
while ((element = await reader.ReadAsync(cancellationToken)) != null)
{
    // Process channel or programme.
}

v2 uses ReadElementAsync:

csharp
using var reader = new XmlTvReader("guide.xml");

XmlTvMetadata metadata = await reader.ReadMetadataAsync(cancellationToken);

while (await reader.ReadElementAsync(cancellationToken) is { } element)
{
    switch (element)
    {
        case XmlTvChannel channel:
            break;

        case XmlTvProgramme programme:
            break;
    }
}

Root <tv> metadata is read separately with ReadMetadataAsync.

Reader Settings

XmlTvReaderSettings was replaced by two concepts:

  • XmlTvReaderOptions for parser behavior.
  • XmlTvReadFilter for branch filtering.

Channel and Programme Filtering

v1 exposed predicate settings such as FilterByChannelId and FilterByProgrammeChannelId.

v2 uses an explicit filter builder for stream-skippable branch selection:

csharp
XmlTvReadFilter filter = XmlTvReadFilter
    .Create()
    .IncludeChannels(channels => channels.WithIds("channel-one"))
    .IncludeProgrammes(programmes => programmes.ForChannels("channel-one"))
    .Build();

XmlTvDocument document = await XmlTvReader.ReadAsync("guide.xml", filter: filter);

v2 does not provide predicate-based time filtering. For custom logic, use forward-only reading and filter after each programme is parsed.

Ignoring Channels or Programmes

v1 had IgnoreChannels and IgnoreProgrammes.

v2 uses XmlTvReadFilter:

csharp
// Read programmes only.
XmlTvReadFilter filter = XmlTvReadFilter
    .Create()
    .IncludeProgrammes()
    .Build();

Building a filter without included branches reads root metadata only:

csharp
XmlTvReadFilter metadataOnly = XmlTvReadFilter.Create().Build();

A null filter reads all supported channels and programmes.

Date and Time

v1 converted programme times with a configured TimeZone.

v2 preserves XMLTV date/time values with XmlTvDateTime:

csharp
XmlTvDateTime start = programme.Start;
string sourceValue = start.ToXmlTvString();

Convert to DateTimeOffset only when the value represents an exact instant:

csharp
DateTimeOffset instant = programme.Start.ToDateTimeOffset();

Named timezone tokens require an explicit resolver. See Date and Time.

Default Language

v1 had DefaultLanguage.

v2 preserves the language value supplied by the feed. Missing language stays missing:

csharp
XmlTvLocalizedText title = programme.Titles[0];
string? language = title.Language;

Apply application defaults in your own code when you need them.

Outer XML

v1 had IncludeOuterXml.

v2 does not put raw outer XML on models. Use the typed model plus XmlTvWriter when you need to reconstruct output.

Unknown Content

Configure unknown elements and attributes through XmlTvReaderOptions:

csharp
var options = new XmlTvReaderOptions
{
    UnknownElementHandling = XmlTvUnknownContentHandling.Ignore,
    UnknownAttributeHandling = XmlTvUnknownContentHandling.Ignore
};

The default behavior favors correctness and reports unsupported content.

Released under the MIT License.