aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/Savers/XmlSaverHelpers.cs')
-rw-r--r--MediaBrowser.Providers/Savers/XmlSaverHelpers.cs53
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>