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

推荐订阅源

博客园_首页
C
Check Point Blog
B
Blog RSS Feed
G
Google Developers Blog
H
Help Net Security
博客园 - Franky
Blog — PlanetScale
Blog — PlanetScale
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Recent Announcements
Recent Announcements
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
DataBreaches.Net
小众软件
小众软件
T
The Blog of Author Tim Ferriss
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
T
Tailwind CSS Blog
J
Java Code Geeks
MyScale Blog
MyScale Blog
雷峰网
雷峰网
有赞技术团队
有赞技术团队
博客园 - 聂微东

博客园 - 会长

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