@ -29,13 +29,11 @@ namespace MediaBrowser.Providers.Savers
/// <param name="xml">The XML.</param>
/// <param name="path">The path.</param>
/// <param name="xmlTagsUsed">The XML tags used.</param>
public static void Save ( StringBuilder xml , string path , IEnumerable < string > xmlTagsUsed )
public static void Save ( StringBuilder xml , string path , List < string > xmlTagsUsed )
{
if ( File . Exists ( path ) )
{
var tags = xmlTagsUsed . ToList ( ) ;
tags . AddRange ( new [ ]
xmlTagsUsed . AddRange ( new [ ]
{
"MediaInfo" ,
"ContentRating" ,
@ -88,7 +86,7 @@ namespace MediaBrowser.Providers.Savers
} ) ;
var position = xml . ToString ( ) . LastIndexOf ( "</" , StringComparison . OrdinalIgnoreCase ) ;
xml . Insert ( position , GetCustomTags ( path , tags ) ) ;
xml . Insert ( position , GetCustomTags ( path , xmlTagsUsed ) ) ;
}
var xmlDocument = new XmlDocument ( ) ;
@ -142,17 +140,46 @@ namespace MediaBrowser.Providers.Savers
/// <param name="path">The path.</param>
/// <param name="xmlTagsUsed">The XML tags used.</param>
/// <returns>System.String.</returns>
private static string GetCustomTags ( string path , I Collection < string > xmlTagsUsed )
private static string GetCustomTags ( string path , I Enumerable < string > xmlTagsUsed )
{
var doc = new XmlDocument ( ) ;
doc . Load ( path ) ;
var settings = new XmlReaderSettings
{
CheckCharacters = false ,
IgnoreProcessingInstructions = true ,
IgnoreComments = true ,
ValidationType = ValidationType . None
} ;
var tagsDictionary = xmlTagsUsed . ToDictionary ( i = > i , StringComparer . OrdinalIgnoreCase ) ;
var nodes = doc . DocumentElement . ChildNodes . Cast < XmlNode > ( )
. Where ( i = > ! xmlTagsUsed . Contains ( i . Name ) )
. Select ( i = > i . OuterXml )
. ToArray ( ) ;
var builder = new StringBuilder ( ) ;
using ( var streamReader = new StreamReader ( path , Encoding . UTF8 ) )
{
// Use XmlReader for best performance
using ( var reader = XmlReader . Create ( streamReader , settings ) )
{
reader . MoveToContent ( ) ;
return string . Join ( Environment . NewLine , nodes ) ;
// Loop through each element
while ( reader . Read ( ) )
{
if ( reader . NodeType = = XmlNodeType . Element )
{
if ( ! tagsDictionary . ContainsKey ( reader . Name ) )
{
builder . AppendLine ( reader . ReadOuterXml ( ) ) ;
}
else
{
reader . Skip ( ) ;
}
}
}
}
}
return builder . ToString ( ) ;
}
/// <summary>