c # Проверка XML DTD. ENTITY - неожиданный знак - PullRequest
0 голосов
/ 08 октября 2009

Я пытаюсь проверить XML-файл, используя .DTD, но выдает следующую ошибку.

'ENTITY' - неожиданный токен. Ожидаемый токен - «DOCTYPE». Строка 538, позиция 3.

        public static void Validate(string xmlFilename, string schemaFilename)
    {
        XmlTextReader r = new XmlTextReader(xmlFilename);
        XmlValidatingReader validator = new XmlValidatingReader(r);
        validator.ValidationType = ValidationType.Schema;

        XmlSchemaCollection schemas = new XmlSchemaCollection();
        schemas.Add(null, schemaFilename);


        validator.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler);

        try
        {
            while (validator.Read())
            { }
        }
        catch (XmlException err)
        {
            Console.WriteLine(err.Message);
        }
        finally
        {
            validator.Close();
        }
    }

DTD, который я использую для проверки = http://www.editeur.org/onix/2.1/reference/onix-international.dtd

Надеюсь, кто-нибудь может мне помочь, спасибо!

Ответы [ 2 ]

0 голосов
/ 01 октября 2013

Я понимаю, что это действительно старый вопрос, но для всех, кто борется с этой проблемой, вот что я сделал.

Я перестал пытаться проверять DTD.

Вместо этого я использовал onix 2.1 xsd, доступный по http://www.editeur.org/15/Previous-Releases/#R%202.1%20Downloads. Мне пришлось установить пространство имен по умолчанию:

var nt = new NameTable();
var ns = new XmlNamespaceManager(nt);
ns.AddNamespace(string.Empty, "http://www.editeur.org/onix/2.1/reference");
var context = new XmlParserContext(null, ns, null, XmlSpace.None);

и затем при загрузке xml отключите разбор DTD (это использует .NET4)

var settings = XmlReaderSettings
                {
                    ValidationType = System.Xml.ValidationType.Schema,
                    DtdProcessing = DtdProcessing.Ignore
                }
using(var reader = XmlReader.Create("path to xml file", settings)) { ... }
0 голосов
/ 08 октября 2009

Edit:

Только что заметил: ваш тип проверки также установлен неправильно. Попробуйте установить значение ValidationType.DTD вместо схемы.

ValidationType в MSDN

-

Ошибка означает в точности то, в каком она указана - DTD, на которое ссылаются, неправильно сформировано, так как DOCTYPE должен присутствовать до любых других объявлений в DTD.

Определение типа документа (Википедия)

Введение в DTD (w3schools)

Возможно, вам удастся обойти это, загрузив локальную копию, изменив ее, добавив в нее ожидаемый корневой элемент, а затем сославшись на отредактированную версию в своем источнике.

...