惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
B
Blog
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
爱范儿
爱范儿
博客园_首页
博客园 - 聂微东
量子位
V
Visual Studio Blog
aimingoo的专栏
aimingoo的专栏
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
F
Fortinet All Blogs
The Cloudflare Blog
T
Tailwind CSS Blog
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
腾讯CDC

博客园 - 会长

本地部署DeepSeek并用Python调用 一个用来将数字转换为英文的MySql函数 Snowflake算法生成Id 用C语言实现ElGamal算法 如何调试WebBrowser控件中的JS代码 解决Devexpress的RichEditControl控件保存为docx文件后在word里打开字体显示不正确的问题 《水浒传》中的物价 诗词记录 对开发流程优化的建议 如何在HP ProLiant-DL580 Gen9 上安装ESXi NumPy基础 闪存客户端 北京某软件园小公园 MySQL优化技巧 大叔学ML第五:逻辑回归 大叔学ML第四:线性回归正则化 大叔学ML第三:多项式回归 大叔学ML第二:线性回归 大叔学ML第一:梯度下降
如何用C#代码验证XML文件是否符合DTD规范
会长 · 2022-09-17 · via 博客园 - 会长

其实在网上可以搜索到相关代码,但是大部分网上找到的代码只适用于较低版本的Framework,如果你使用的Framework版本较高,用网上常见的代码来验证包含外部dtd引用的xml是验证通不过的。以下是正确的代码:

internal class Program
{
    static void Main(string[] args)
    {
        if (!Validate(@"e:\xml\引用dtd文件的xml.xml", out string errorMessage))
        {
            Console.WriteLine(errorMessage);
        }
        else
        {
            Console.WriteLine("That's ok");
        }
        Console.ReadLine();
    }

    static bool Validate(string xmlFile, out string errorMessage)
    {
        errorMessage = String.Empty;

        var sb = new StringBuilder();

        XmlReaderSettings settings = new XmlReaderSettings
        {
            DtdProcessing = DtdProcessing.Parse,
            ValidationType = ValidationType.DTD,
            XmlResolver = new XmlUrlResolver() // 注意这里,没有这句的话无法验证引用了外部dtd的xml文件
        };

        settings.ValidationEventHandler += (s, e) => { sb.Append($"-\n{e.Message}"); };

        try
        {
            using (var reader = XmlReader.Create(xmlFile, settings))
            {
                while (reader.Read()) ;
            }
        }
        catch (Exception ex)
        {
            sb.Append(ex.Message);
        }

        if (sb.Length > 0)
        {
            errorMessage = sb.ToString();
        }

        return sb.Length == 0;
    }
}

附上3个示例文件:

自包含dtd的xml.xml:

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
  <body>D

引用dtd文件的xml.xml

<!--XML file using a DTD-->
<!DOCTYPE store SYSTEM "dtd文件.dtd">
<store>
  <item type="supplies">
    <name>paint</name>
    <price>16.95</price>
  </item>
</store>

dtd文件.dtd:

<!ELEMENT store (item)*> 
<!ELEMENT item (name,price)>
<!ATTLIST item type CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>