4

我正在尝试通过 .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 文件。我想选择一个不同的目录来保存 .dtd 文件,但我真的找不到方法。

感谢您的时间。

4

1 回答 1

2

在 Xml 文件中声明与 DTD 的关联:

dtd 存储在远程服务器中的示例:

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

查看该wiki 页面该站点以获取有关 Xml 文件和 DTD 关联的更多选项和信息。

dtd 放置在本地 (SYSTEM) 的示例:

如何从文档中引用 DTD

假设文档的顶部元素是spec并且 dtd 放置在文件 mydtd 中,该文件位于加载文档的目录的子目录 dtds 中

<!DOCTYPE spec SYSTEM "dtds/mydtd">

备注

系统字符串实际上是一个 URI-Reference(如 RFC 2396 中所定义),因此您可以使用完整的 URL 字符串来指示您的 DTD 在 Web 上的位置。如果您希望其他人验证您的文档,这是一件非常好的事情。还可以关联一个 PUBLIC 标识符(一个魔术字符串),以便在客户端的目录中查找 DTD,而不必在 Web 上找到它。DTD 包含一组元素和属性声明,但它们没有定义文档的根应该是什么。这作为 DOCTYPE 声明的第一个元素被明确告知解析器/验证器。

(摘自这里

于 2012-11-09T14:57:58.497 回答