[DatFile] Make XML parsing safer; skip malformed XML lines

This commit is contained in:
Matt Nadareski
2016-09-28 12:27:39 -07:00
parent 735e76ccda
commit 36f9b12d06
5 changed files with 824 additions and 811 deletions

View File

@@ -33,7 +33,7 @@ namespace SabreTools
Dictionary<string, Tuple<long, bool>> depots = new Dictionary<string, Tuple<long, bool>>();
// Get the XML text reader for the configuration file, if possible
XmlTextReader xtr = FileTools.GetXmlTextReader(_config, _logger);
XmlReader xtr = FileTools.GetXmlTextReader(_config, _logger);
// Now parse the XML file for settings
if (xtr != null)

View File

@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
namespace SabreTools.Helper
{

View File

@@ -2228,7 +2228,8 @@ namespace SabreTools.Helper
ItemStatus its = ItemStatus.None;
List<string> parent = new List<string>();
XmlTextReader xtr = FileTools.GetXmlTextReader(filename, logger);
Encoding enc = Style.GetEncoding(filename);
XmlReader xtr = FileTools.GetXmlTextReader(filename, logger);
// If we got a null reader, just return
if (xtr == null)
@@ -2237,6 +2238,8 @@ namespace SabreTools.Helper
}
// Otherwise, read the file to the end
try
{
xtr.MoveToContent();
while (!xtr.EOF)
{
@@ -3068,6 +3071,12 @@ namespace SabreTools.Helper
break;
}
}
}
catch
{
// For XML errors, just skip the affected node
xtr?.Skip();
}
xtr.Dispose();
}

View File

@@ -64,7 +64,7 @@ namespace SabreTools.Helper
}
Logger logger = new Logger(false, "");
XmlTextReader xtr = FileTools.GetXmlTextReader(filename, logger);
XmlReader xtr = FileTools.GetXmlTextReader(filename, logger);
if (xtr == null)
{

View File

@@ -6,6 +6,7 @@ using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Xml;
using System.Xml.Schema;
namespace SabreTools.Helper
{
@@ -176,7 +177,7 @@ namespace SabreTools.Helper
/// <param name="filename">Name of the file to be parsed</param>
/// <param name="logger">Logger object for console and file output</param>
/// <returns>The XmlTextReader representing the (possibly converted) file, null otherwise</returns>
public static XmlTextReader GetXmlTextReader(string filename, Logger logger)
public static XmlReader GetXmlTextReader(string filename, Logger logger)
{
logger.Verbose("Attempting to read file: \"" + filename + "\"");
@@ -187,10 +188,14 @@ namespace SabreTools.Helper
return null;
}
XmlTextReader xtr;
xtr = new XmlTextReader(filename);
xtr.WhitespaceHandling = WhitespaceHandling.None;
xtr.DtdProcessing = DtdProcessing.Ignore;
XmlReader xtr = XmlReader.Create(filename, new XmlReaderSettings {
CheckCharacters = false,
DtdProcessing = DtdProcessing.Ignore,
IgnoreComments = true,
IgnoreWhitespace = true,
ValidationFlags = XmlSchemaValidationFlags.None,
ValidationType = ValidationType.None,
});
return xtr;
}