通过DTD,不同的目录中的DTD验证XML(Validate xml via dtd, differ

2019-08-02 13:01发布

我试图通过.dtd验证XML文件。 我写这个验证:

    public bool Validation(XmlDocument xmlDoc)
    {
        var xml = XmldocToString(xmlDoc);
        var r = new XmlTextReader(new StringReader(xml));
        var settings = new XmlReaderSettings();
        var sb = new StringBuilder();
        settings.ProhibitDtd = false;
        settings.ValidationType = ValidationType.DTD;
        settings.ValidationEventHandler += (a, e) =>
        {
            sb.AppendLine(e.Message);
            _isValid = false;
        };
        XmlReader validator = XmlReader.Create(r, settings);
        while (validator.Read())
        {
        }
        validator.Close();

        return _isValid;
    }

问题是,我必须在解决方案的bin目录中的DTD文件。 我想选择了diferent目录,以保持.dtd文件,我真的找不到如何。

感谢您的时间。

Answer 1:

声明在XML文件与DTD的关系:

实施例的情况下,DTD中被存储在远程服务器:

<!DOCTYPE Catalog PUBLIC "abc/Catalog" "http://xyz.abc.org/dtds/catalog.dtd">

看看那个wiki页面 ,并在该网站的更多选项和有关XML文件和DTD关联信息。

实施例的情况下,DTD中被局部地(SYSTEM)放置:

如何从一个文件引用DTD:

假设文档的顶部元件是规范 ,DTD是放置在从原稿装载其中的目录的子目录的DTD文件mydtd:

<!DOCTYPE spec SYSTEM "dtds/mydtd">

注意事项

该系统串实际上是一个URI引用(如RFC 2396中定义),所以你可以使用指示在网络上你的DTD的位置的完整URL字符串。 这是,如果你希望别人来验证你的文件做一个真正的好东西。 也可以到公共标识符(一个神奇的字符串),以使DTD在客户端上的目录抬头,而不必找到它在网络上联系起来。 一个DTD包含了一组元素和属性声明,但他们不定义文档的根应该是什么。 这明确地告诉解析器/验证的DOCTYPE声明的第一要素。

(摘自这里



文章来源: Validate xml via dtd, different directory for dtd