diff --git a/XmlSchemaClassGenerator.Tests/XmlTests.cs b/XmlSchemaClassGenerator.Tests/XmlTests.cs index 236f18f..dbd0a0b 100644 --- a/XmlSchemaClassGenerator.Tests/XmlTests.cs +++ b/XmlSchemaClassGenerator.Tests/XmlTests.cs @@ -61,25 +61,13 @@ private static IEnumerable ConvertXml(string name, IEnumerable x CollectionSettersMode = generatorPrototype.CollectionSettersMode, UseArrayItemAttribute = generatorPrototype.UseArrayItemAttribute, EnumAsString = generatorPrototype.EnumAsString, + AllowDtdParse = generatorPrototype.AllowDtdParse }; gen.CommentLanguages.Clear(); gen.CommentLanguages.UnionWith(generatorPrototype.CommentLanguages); - var set = new XmlSchemaSet(); - - foreach (var xsd in xsds) - { - using var stringReader = new StringReader(xsd); - var schema = XmlSchema.Read(stringReader, (s, e) => - { - throw new InvalidOperationException($"{e.Severity}: {e.Message}",e.Exception); - }); - - set.Add(schema); - } - - gen.Generate(set); + gen.Generate(xsds.Select(i => new StringReader(i))); return writer.Content; } @@ -3012,5 +3000,86 @@ public void SimpleInterface(bool generateInterface) Assert.Null(interfaceCommon); } } + + + [Fact] + public void TestAllowDtdParse() + { + const string xsd = @" + + + +]> + + + + + List of Profiles + + + + + + + + + + + +"; + var generator = new Generator + { + NamespaceProvider = new NamespaceProvider + { + GenerateNamespace = key => "Test" + }, + AllowDtdParse = true + }; + + var generatedType = ConvertXml(nameof(TestAllowDtdParse), xsd, generator).First(); + + Assert.Contains(@"public partial class ComplexType", generatedType); + Assert.Contains(@"[a-zA-Z0-9]+", generatedType); + } + + [Fact] + public void TestNotAllowDtdParse() + { + const string xsd = @" + + + +]> + + + + + List of Profiles + + + + + + + + + + + +"; + var generator = new Generator + { + NamespaceProvider = new NamespaceProvider + { + GenerateNamespace = key => "Test" + }, + AllowDtdParse = false + }; + + var exception = Assert.Throws(() => ConvertXml(nameof(TestNotAllowDtdParse), xsd, generator)); + Assert.Contains("Reference to undeclared entity 'lowalpha'", exception.Message); + } } } diff --git a/XmlSchemaClassGenerator/Generator.cs b/XmlSchemaClassGenerator/Generator.cs index b9d96f5..7e584d8 100644 --- a/XmlSchemaClassGenerator/Generator.cs +++ b/XmlSchemaClassGenerator/Generator.cs @@ -1,7 +1,7 @@ using System; using System.CodeDom; using System.Collections.Generic; -using System.Diagnostics; +using System.IO; using System.Linq; using System.Text; using System.Xml; @@ -356,10 +356,20 @@ static Generator() } public void Generate(IEnumerable files) + { + var settings = CreateSettings(); + Generate(files.Select(f => XmlReader.Create(f, settings))); + } + + public void Generate(IEnumerable streams) + { + var settings = CreateSettings(); + Generate(streams.Select(f => XmlReader.Create(f, settings))); + } + + public void Generate(IEnumerable readers) { var set = new XmlSchemaSet(); - var settings = new XmlReaderSettings { DtdProcessing = AllowDtdParse ? DtdProcessing.Parse : DtdProcessing.Ignore }; - var readers = files.Select(f => XmlReader.Create(f, settings)); ValidationError = false; @@ -413,5 +423,10 @@ public void Generate(XmlSchemaSet set) writer.Write(ns); } } + + private XmlReaderSettings CreateSettings() + { + return new XmlReaderSettings { DtdProcessing = AllowDtdParse ? DtdProcessing.Parse : DtdProcessing.Ignore }; + } } } \ No newline at end of file