diff options
Diffstat (limited to 'MediaBrowser.Providers/Savers/XmlSaverHelpers.cs')
| -rw-r--r-- | MediaBrowser.Providers/Savers/XmlSaverHelpers.cs | 53 |
1 files changed, 40 insertions, 13 deletions
diff --git a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs index cea7cf9268..338447c100 100644 --- a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs +++ b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs @@ -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, ICollection<string> xmlTagsUsed) + private static string GetCustomTags(string path, IEnumerable<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> |
