通过DTD验证XML,使用不同的目录来存放DTD文件。

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

问题在于我必须把DTD文件放在解决方案的bin目录中。我想选择一个不同的目录来保存DTD文件,但我真的找不到方法。
谢谢您的时间。
1个回答

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

如果 dtd 存储在远程服务器上的示例:

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

请查看维基页面该网站,了解有关XML文件和DTD关联的更多选项和信息。

如果DTD放置在本地(SYSTEM)中的示例:

如何从文档引用DTD

假设文档的顶级元素是spec,DTD放置在从加载文档的目录中dtds的子目录中的mydtd文件中

<!DOCTYPE spec SYSTEM "dtds/mydtd">

注释: 系统字符串实际上是一个URI引用(如RFC 2396中定义的),因此您可以使用完整的URL字符串指示DTD在Web上的位置。如果您希望其他人验证您的文档,这是一件非常好的事情。还可以关联公共标识符(魔术字符串),以便在客户端上通过目录查找DTD而无需在Web上定位它。DTD包含一组元素和属性声明,但它们不定义文档的根。这是通过DOCTYPE声明的第一个元素明确告知解析器/验证器的。
(摘自这里

预期存储在XML文件中的DTD将类似于以下内容:<!DOCTYPE tmx SYSTEM "tmx14.dtd"> 您的意思是我应该通过更改XML文件来重定向DTD调用吗? - Turambar
1
谢谢您的时间。但我不想验证我的文档,而是他人的文档,因此我更愿意避免对它们进行修改。我希望能够调整解析器/验证器以从我喜欢的目录中获取DTD。 - Turambar
现在XML文件和DTD文件在同一个目录下,也就是“bin”目录,对吗?如果是这样的话,你可以把这两个文件移动到你喜欢的其他目录中吗? - Tony Rad
另一个想法是在bin目录中放置tmx14.dtd文件的符号链接,并将实际文件放置在任何您想要的位置。 - Tony Rad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接