Почему я получаю сообщение об ошибке при загрузке XML-файла с помощью XmlDocument? - PullRequest
1 голос
/ 13 марта 2019

У меня есть XML-файл, например:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget &xyz me this weekend!</body>
</note>

Здесь say & xyz - это объект, который объявлен в файле Note.dtd. Но когда я пытаюсь это сделать, это дает мне ошибку - Ссылка на необъявленную сущность 'xyz'.

XmlDocument doc = new XmlDocument();
doc.Load(filePath);  // Error is thrown at this line

Разве XmlDocument не проверяет внешние ссылки dtds? Как решить эту проблему?

1 Ответ

1 голос
/ 13 марта 2019

Чтобы загрузить XmlDocument и проверить его на соответствие DTD и разрешить объекты, необходимо настроить XmlReader для проверки.

Вот пример, который работает с вашим XML-файлом

using System;
using System.Xml;
using System.Xml.Schema;

namespace DtdValidation
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.DtdProcessing = DtdProcessing.Parse;
            settings.ValidationType = ValidationType.DTD;
            settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            settings.XmlResolver = new XmlUrlResolver();

            XmlDocument doc = new XmlDocument();
            XmlReader reader = XmlReader.Create("data.xml", settings);
            doc.Load(reader);
        }

        // Display any validation errors.
        private static void ValidationCallBack(object sender, ValidationEventArgs e)
        {
            Console.WriteLine("Validation Error: {0}", e.Message);
        }
    }
}

Здесьиспользуется DTD, который объявляет сущность xyz

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ENTITY xyz "->">

Оригинальный ответ - я изначально неправильно прочитал вопрос

& - это специальный символ в XML, поэтому, если вы хотите включить литерал и вам необходимо его кодировать с помощью &amp; Вот другие кодировки, с которыми вы можете столкнуться

< &lt;
> &gt;
& &amp
" &quot;
' &apos;
...