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

推荐订阅源

WordPress大学
WordPress大学
N
News | PayPal Newsroom
雷峰网
雷峰网
Y
Y Combinator Blog
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
Blog — PlanetScale
Blog — PlanetScale
F
Fortinet All Blogs
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
U
Unit 42
The Cloudflare Blog
The GitHub Blog
The GitHub Blog
Recorded Future
Recorded Future
Vercel News
Vercel News
N
Netflix TechBlog - Medium
GbyAI
GbyAI
博客园 - 司徒正美
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
J
Java Code Geeks
P
Proofpoint News Feed
I
InfoQ
IT之家
IT之家
F
Full Disclosure
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google DeepMind News
Google DeepMind News
Apple Machine Learning Research
Apple Machine Learning Research
Forbes - Security
Forbes - Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cyber Attacks, Cyber Crime and Cyber Security
The Last Watchdog
The Last Watchdog
月光博客
月光博客
W
WeLiveSecurity
S
Securelist
Schneier on Security
Schneier on Security
Help Net Security
Help Net Security
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
P
Privacy & Cybersecurity Law Blog
L
LINUX DO - 最新话题
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Scott Helme
Scott Helme
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - Franky
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org

博客园 - 会长

本地部署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)>