読者です 読者をやめる 読者になる 読者になる

ぽにょろん

思いついたこととメモ

.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部分が取れてこない。
f:id:kowill:20150923092528p:plain
試しに、TargetFramworkを変更してみると、

という結果に。

解決

ということで、おなじみのMSDN

XmlReader.Create メソッド (System.Xml)

書いてありました。

f:id:kowill:20150923092020p:plain

ありがとうMSDN

さらに原文の方を見ると、

f:id:kowill:20150923092023p:plain

はひ。そうですか、そうですよね。 という感じに。

というわけで、

var reader = XmlReader.Create(path, new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse, XmlResolver = new XmlUrlResolver() })  

みたいにしてあげれば良さそう。

f:id:kowill:20150923092726p:plain

というわけで解決。 そもそもの構造が良くなさそうってのもありますが、良い勉強になりました(笑)

ソースサンプル

XmlReaderでDTD読み込み