Создание XML с использованием C # и внешнего DTD - PullRequest
1 голос
/ 03 августа 2010

Это мои первые шаги с XML, и я должен отправить XML с помощью HttpRequest (что сейчас не проблема для меня). У меня вопрос о DTD. Согласно API назначения HttpRequest, я должен проверить свой XML с помощью внешнего DTD, который находится там (это для Канадской почтовой доставки: http://cybervente.postescanada.ca/DevelopersResources/protocolV3/eParcel.dtd). Я знаю, как писать / читать XML, но не согласно DTD ... Есть ли разница?

Может кто-нибудь сказать мне, как и самый простой способ сделать это? Я смотрю хорошую часть хорошего сообщения от Google, и я никогда не получаю то, что ищу ...

Спасибо!

ADD # 1

Примечание: я знаю, для чего нужен DTD, и я могу создать его самостоятельно с помощью простого текстового редактора и основывать XML на DTD, но я действительно имею в виду, есть ли способ использовать DTD в C # ( Создание объекта или что-то ...)

ADD # 2 Дополнение: Кто-нибудь из вас, ребята, уже настроил приложение для общения с API Канадской почты, используя webresque? Потому что я вонючий! Я отправляю свой запрос с моими данными, и он никогда не заканчивается, поэтому никогда не возвращаю ответ ... вот мой код:

public oShippingResponse RetreiveShippingCost(oShippingInformations shipInfos) {
        // Send request                             
        WebRequest request = WebRequest.Create("http://sellonline.canadapost.ca");
        XmlDocument xmlDoc = shipInfos.WriteAsXML();
        request.ContentType = "text/xml";
        request.Method = "POST";

        xmlDoc.Save(request.GetRequestStream());
        try {
            WebResponse response = request.GetResponse();
        } catch (Exception ex) {
            throw ex;
        }
        return new oShippingResponse();
    }

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

Нет, в нет никакой разницы в том, как вы пишете свой XML, кроме того, что вы должны соблюдать правила, изложенные в DTD. Понимание и чтение DTD - это искусство, поэтому я надеюсь, что у Canada Post есть более наглядный способ объяснить вам формат, чтобы помочь вам в создании правильного XML.

Затем, что запрашивает Почта Канады, вы должны проверить ваш XML с DTD. Хотя быть действительным, это не значит, что ввод правильный, но он должен предупредить вас о неправильном вводе. И именно поэтому они хотят, чтобы вы сделали это: если ваш вывод гарантированно соответствует DTD, они могут гарантировать вам, что смогут обработать ввод (в большинстве случаев, по крайней мере).

Вот как вы можете проверить свои данные по DTD, используя C # в службе поддержки Microsoft .

Примечание по редактированию XML вручную: большинство редакторов XML способны читать DTD и предупреждать вас о правильности DTD или даже предоставлять вам помощь по синтаксису во время ввода, т. Е. В Visual Studio. Стандарт XML требует, чтобы в случае присутствия DTD в заголовке XML сам XML должен был быть проверенным и не должен обрабатываться , если он недействителен для DTD.

1 голос
/ 03 августа 2010

Вам необходимо создать проверяющий XML-ридер.Вам понадобится XmlSchemaSet для хранения схемы, и вам понадобится объект XmlReaderSettings для настройки параметров конфигурации для XmlReader.Что-то вроде (не проверено):

var schemaSet = new XmlSchemaSet();
schemaSet.Add(null, pathToSchema);

var settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.DTD;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.Schemas = schemas;
settings.ConformanceLevel = ConformanceLevel.Document;
settings.ValidationEventHandler += ValidationHandler;

using(var fstream = new FileStream(pathToDocument))
{
    using(var reader = XmlReader.Create(documentStream, settings))
    {
        while(reader.Read())
        {
        }
    }
}

В ValidationHandler вы можете делать такие вещи, как перехват любых ошибок / предупреждений проверки, которые могут вас заинтересовать в выводе.

...