Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#和外部DTD创建XML_C#_Asp.net_Dtd - Fatal编程技术网

使用C#和外部DTD创建XML

使用C#和外部DTD创建XML,c#,asp.net,dtd,C#,Asp.net,Dtd,这是我使用XML的第一步,我必须通过HttpRequest发送一个XML(现在这对我来说不是问题)。我有一个关于DTD的问题。根据HttpRequest目的地API,我必须使用位于那里的外部DTD验证我的XML(这是针对加拿大邮政局的:)。我知道如何写/读XML,但不是根据DTD。。。有区别吗 有人能告诉我怎么做和最简单的方法吗?我已经从谷歌的好帖子中找到了很好的一部分,但我从来没有在寻找什么 谢谢大家! 添加#1 注意:我知道DTD的用途,我可以用纯文本编辑器自己创建一个DTD,并基于DTD创

这是我使用XML的第一步,我必须通过HttpRequest发送一个XML(现在这对我来说不是问题)。我有一个关于DTD的问题。根据HttpRequest目的地API,我必须使用位于那里的外部DTD验证我的XML(这是针对加拿大邮政局的:)。我知道如何写/读XML,但不是根据DTD。。。有区别吗

有人能告诉我怎么做和最简单的方法吗?我已经从谷歌的好帖子中找到了很好的一部分,但我从来没有在寻找什么

谢谢大家!

添加#1

注意:我知道DTD的用途,我可以用纯文本编辑器自己创建一个DTD,并基于DTD创建XML,但我的真正意思是,有没有一种方法可以利用C#中的DTD(创建对象或其他东西…)

添加#2 附加:你们中有人已经设置了一个应用程序来使用webresque与加拿大邮政API进行对话吗?因为我很臭!我发送我的请求和我的数据,它永远不会完成,所以永远不会返回响应。。。这是我的密码:

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();
    }

不,编写XML的方式没有区别,只是应该遵守DTD中列出的规则。理解和阅读DTD是一门艺术,因此我希望《加拿大邮报》能以更具描述性的方式向您解释格式,以帮助您创建正确的XML

然后,对于加拿大的Post请求,您应该根据DTD验证XML。虽然有效并不意味着输入是正确的,但它应该提前警告您无效的输入。这正是他们希望您这样做的原因:如果您的输出与DTD相对应,他们可以保证您可以处理输入(至少在大多数情况下)

你可以这样做


关于手工编辑XML的注意事项:大多数XML编辑器都能够读取DTD并警告您DTD是正确的,甚至在您键入时(即在Visual Studio中)为您提供语法帮助。XML标准要求,如果XML头中存在DTD,则必须验证XML本身,如果对DTD无效,则不得对其进行处理。

您需要创建一个验证XML读取器。您需要一个XmlSchemaSet来存储模式,还需要一个XmlReaderSettings对象来设置XmlReader的配置选项。类似于(未经测试):


在ValidationHandler中,您可以捕获您可能有兴趣输出的任何验证错误/警告。

是的,它们在PDF文档的其他地方也显示了我们的XML应该喜欢的示例。我已经找到了所有关于如何使用它的代码示例。所以,这就是我问你们的原因。但是,没关系,我会用这个链接做你给我看的事情!谢谢@西蒙,不客气:)。我同时编辑了答案。使用DTD还可以帮助您手工编辑XML。但我是用对象编程的。对象将有一个“WriteXML()”。好的,我如何使用它进行编程?@Simon:如果您对
WriteXML()
方法使用
System.Xml
方法(您确实应该这样做,甚至不要试图手工编写输出!),那么您可以在创建Xml对象时预加载DTD。当您尝试编写DTD不允许的任何内容时,这将给您一个早期警告。我将对其进行测试并获得反馈!谢谢你,小姐!只有当XML从内部引用DTD时,它才起作用。它不允许针对现有XML内容指定DTD文件。我不确定是否理解您添加的问题。您的意思是要自动生成类吗?在这种情况下,答案可能是否定的。有几个库可以从XSD模式创建类,但我发现没有一个库可以从DTD创建类。
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())
        {
        }
    }
}