none
【C#】エラー:セキュリティ上の理由から、DTD はこの XML ドキュメントでは使用できません。 RRS feed

  • 質問

  • エラーが解決できなくて困っています。

    C#に関しては全くの素人でどうしたらいいかわかりません。

    どなたかわかる方教えてください!!

    以下に情報を書いておきます。

    ■エラー

    型 'System.Xml.XmlException' のハンドルされていない例外が System.Xml.dll で発生しました

    追加情報: セキュリティ上の理由から、DTD はこの XML ドキュメントでは使用できません。

    DTD 処理を有効にするには、XmlReaderSettings の DtdProcessing プロパティを Parse に設定し、
    XmlReader.Create メソッドにその設定を渡してください。

    ■状況

    簡易RSSリーダーを参考書に沿って作成していたところ、上のエラーが出てきた。

    参考書付属の完成版ソースコードを実行しても同じエラーが出てきた。

    ネットで調べて、見よう見まねで次を追加してみるもうまくいかず。

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Parse;

    ⇒XmlReader.Createにsettingsを渡す。

    ■開発環境

    ・Windows8

    ・MicroSoft VisualStudio Express 2012

    ・セキュリティーソフトはNorton(一応書いておきます)

    ・参考書は「作って覚えるC#入門」(2010年)


    ■ソースコード

                

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
    using System.Net;
    using System.Xml;

    namespace SimpleRSSReader
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void OpenRSSAll()
            {
                //ネットアクセスするためWebClientのを作成
                WebClient webClient = new WebClient();

                //URLを開き、ストリームとして読み込む
                using (Stream stream = webClient.OpenRead(textBoxURL.Text))
                {
                    //ストリームリーダーを作成(UTF-8でエンコード)
                    using (StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("utf-8")))
                    {
                        //ストリームの末尾になるまで繰り返す
                        while (!streamReader.EndOfStream)
                        {
                            //リストボックスに1行ずつ追加
                            listBoxRSS.Items.Add(streamReader.ReadLine());
                        }
                    }
                }

            }

            private void buttonOpen_Click(object sender, EventArgs e)
            {
                //OpenRSSAll();
                OpenRSSXmlReader();
            }

            private void OpenRSSXmlReader()
            {

                //URLからRSSファイルを読み取るxmlReaderを作成
                using (XmlReader xmlReader = XmlReader.Create(textBoxURL.Text))
                {
                    //ノードがある限り、読み込む
                    while (xmlReader.Read())
                    {
                        //<item>に移動
                        xmlReader.ReadToFollowing("item");
                        //<title>へ移動
                        xmlReader.ReadToFollowing("titile");
                        //<title></tilte>の中身をリストボックスに追加
                        listBoxRSS.Items.Add(xmlReader.ReadString());
                    }
                }
            }
        }


    }

    以上

    2013年8月26日 8:54

回答

  • その修正を加えて、再度実行してみてください。それでも、そこで同じ例外が発生しますか?

    (意外に思い込みって強いものなので、さっき試したはずってのはおいておいて、確実に確認してください。)

    発生する例外が変わっていたり、実はそこじゃなかったりと言うことはありませんか?

    // 差し支えなければそのxmlも見たいところですが…。


    • 編集済み Hongliang 2013年8月27日 12:51
    • 回答としてマーク You_Know_Who 2013年8月28日 5:18
    2013年8月27日 12:51

すべての返信

  • ネットで調べて、見よう見まねで次を追加してみるもうまくいかず。

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Parse;

    ⇒XmlReader.Createにsettingsを渡す。

    と仰る割には、ソースコードに存在していないようですが。
    2013年8月26日 9:45
  • すみません。どうせ間違っているだろうと思い、削除してしました。

    以下、追加したソースコードです。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
    using System.Net;
    using System.Xml;

    namespace SimpleRSSReader
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void OpenRSSAll()
            {
                //ネットアクセスするためWebClientのを作成
                WebClient webClient = new WebClient();

                //URLを開き、ストリームとして読み込む
                using (Stream stream = webClient.OpenRead(textBoxURL.Text))
                {
                    //ストリームリーダーを作成(UTF-8でエンコード)
                    using (StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("utf-8")))
                    {
                        //ストリームの末尾になるまで繰り返す
                        while (!streamReader.EndOfStream)
                        {
                            //リストボックスに1行ずつ追加
                            listBoxRSS.Items.Add(streamReader.ReadLine());
                        }
                    }
                }

            }

            private void buttonOpen_Click(object sender, EventArgs e)
            {
                //OpenRSSAll();
                OpenRSSXmlReader();
            }

            private void OpenRSSXmlReader()
            {

       XmlReaderSettings settings = new XmlReaderSettings();
        settings.DtdProcessing = DtdProcessing.Parse;

                //URLからRSSファイルを読み取るxmlReaderを作成
                using (XmlReader xmlReader = XmlReader.Create(textBoxURL.Text,settings))
                {
                    //ノードがある限り、読み込む
                    while (xmlReader.Read())
                    {
                        //<item>に移動
                        xmlReader.ReadToFollowing("item");
                        //<title>へ移動
                        xmlReader.ReadToFollowing("titile");
                        //<title></tilte>の中身をリストボックスに追加
                        listBoxRSS.Items.Add(xmlReader.ReadString());
                    }
                }
            }
        }


    }

    2013年8月27日 12:08
  • その修正を加えて、再度実行してみてください。それでも、そこで同じ例外が発生しますか?

    (意外に思い込みって強いものなので、さっき試したはずってのはおいておいて、確実に確認してください。)

    発生する例外が変わっていたり、実はそこじゃなかったりと言うことはありませんか?

    // 差し支えなければそのxmlも見たいところですが…。


    • 編集済み Hongliang 2013年8月27日 12:51
    • 回答としてマーク You_Know_Who 2013年8月28日 5:18
    2013年8月27日 12:51
  • あ!わかりました!

    入力するURLをxmlにしなければいけなかったのですね!

    普通のURLを入力していました。。。

    「xmlも見たい」と言われ気づきました

    無事解決です!

    ほんとに何度も親切にありがとうございました!!

    2013年8月28日 5:18