Skip to content

Commit

Permalink
Add option to parse DTD - Unit tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
jaroslaw-dutka committed Jun 13, 2024
1 parent 82e8849 commit d6edab4
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 17 deletions.
97 changes: 83 additions & 14 deletions XmlSchemaClassGenerator.Tests/XmlTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,25 +61,13 @@ private static IEnumerable<string> ConvertXml(string name, IEnumerable<string> 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;
}
Expand Down Expand Up @@ -3012,5 +3000,86 @@ public void SimpleInterface(bool generateInterface)
Assert.Null(interfaceCommon);
}
}


[Fact]
public void TestAllowDtdParse()
{
const string xsd = @"<?xml version=""1.0"" encoding=""utf-8""?>
<!DOCTYPE schema [
<!ENTITY lowalpha ""a-z"">
<!ENTITY hialpha ""A-Z"">
<!ENTITY digit ""0-9"">
]>
<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
<xs:simpleType name=""CodecsType"">
<xs:annotation>
<xs:documentation xml:lang=""en"">
List of Profiles
</xs:documentation>
</xs:annotation>
<xs:restriction base=""xs:string"">
<xs:pattern value=""[&lowalpha;&hialpha;&digit;]+""/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name=""ComplexType"">
<xs:attribute name=""codecs"" type=""CodecsType""/>
</xs:complexType>
</xs:schema>
";
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 = @"<?xml version=""1.0"" encoding=""utf-8""?>
<!DOCTYPE schema [
<!ENTITY lowalpha ""a-z"">
<!ENTITY hialpha ""A-Z"">
<!ENTITY digit ""0-9"">
]>
<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
<xs:simpleType name=""CodecsType"">
<xs:annotation>
<xs:documentation xml:lang=""en"">
List of Profiles
</xs:documentation>
</xs:annotation>
<xs:restriction base=""xs:string"">
<xs:pattern value=""[&lowalpha;&hialpha;&digit;]+""/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name=""ComplexType"">
<xs:attribute name=""codecs"" type=""CodecsType""/>
</xs:complexType>
</xs:schema>
";
var generator = new Generator
{
NamespaceProvider = new NamespaceProvider
{
GenerateNamespace = key => "Test"
},
AllowDtdParse = false
};

var exception = Assert.Throws<XmlException>(() => ConvertXml(nameof(TestNotAllowDtdParse), xsd, generator));
Assert.Contains("Reference to undeclared entity 'lowalpha'", exception.Message);
}
}
}
21 changes: 18 additions & 3 deletions XmlSchemaClassGenerator/Generator.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -356,10 +356,20 @@ static Generator()
}

public void Generate(IEnumerable<string> files)
{
var settings = CreateSettings();
Generate(files.Select(f => XmlReader.Create(f, settings)));
}

public void Generate(IEnumerable<TextReader> streams)
{
var settings = CreateSettings();
Generate(streams.Select(f => XmlReader.Create(f, settings)));
}

public void Generate(IEnumerable<XmlReader> 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;

Expand Down Expand Up @@ -413,5 +423,10 @@ public void Generate(XmlSchemaSet set)
writer.Write(ns);
}
}

private XmlReaderSettings CreateSettings()
{
return new XmlReaderSettings { DtdProcessing = AllowDtdParse ? DtdProcessing.Parse : DtdProcessing.Ignore };
}
}
}

0 comments on commit d6edab4

Please sign in to comment.