.NET Framework 4.5.2 でXmlReaderのDTD読み込みの挙動が変わっていた
以前、少しはまってしまったので、メモしておきます。
先に解決策書いておくと、ちゃんとXmlResolverのインスタンス作成しておきましょう!です。
問題点
TargetFramworkを4から4.6に上げた際に、DTDの外部実体参照が読み込まれなくなってしまっていた。
その時の読み込み部分。
var reader = XmlReader.Create(path, new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse })
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE Samples[ <!ENTITY Sub1 SYSTEM "Body\Sub1.txt"> ]> <Samples> <Title>あいうえお</Title> <Body>&Sub1;</Body> </Samples>
Titleは取れるが、Body部分が取れてこない。
試しに、TargetFramworkを変更してみると、
- .NET Framework 4 → ○
- .NET Framework 4.5.1 → ○
- .NET Framework 4.5.2 → ×
- .NET Framework 4.6 → ×
という結果に。
解決
ということで、おなじみのMSDN。
XmlReader.Create メソッド (System.Xml)
書いてありました。
ありがとうMSDN。
さらに原文の方を見ると、
はひ。そうですか、そうですよね。 という感じに。
というわけで、
var reader = XmlReader.Create(path, new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse, XmlResolver = new XmlUrlResolver() })
みたいにしてあげれば良さそう。
というわけで解決。 そもそもの構造が良くなさそうってのもありますが、良い勉強になりました(笑)