c#通过DTD验证读取XML

本文关键字:读取 XML 验证 DTD 通过 | 更新日期: 2023-09-27 18:13:53

我试图读取具有dtd验证的XML文件,但无论我如何做,似乎程序不读取我的dtd文件。我把问题集中到一个小xml文件和一个小dtd文件:

test.xml -位于c:'test.xml

<?xml version="1.0"?>
<!DOCTYPE Product SYSTEM "test.dtd">
<Product ProductID="123">
   <ProductName>Rugby jersey</ProductName>
</Product>

测试。DTD -位于c:'test.dtd

<!ELEMENT Product (ProductName)>
<!ATTLIST Product ProductID CDATA #REQUIRED>
<!ELEMENT ProductName (#PCDATA)>

我的c#程序是这样的

namespace XML_to_csv_converter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            ReadXMLwithDTD();
        }
        public void ReadXMLwithDTD()
        {
            // Set the validation settings.
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.DTD;
            settings.DtdProcessing = DtdProcessing.Parse;
            settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            settings.IgnoreWhitespace = true;
            // Create the XmlReader object.
            XmlReader reader = XmlReader.Create("c:/test.xml", settings);
            // Parse the file.
            while (reader.Read())
            {
                System.Console.WriteLine("{0}, {1}: {2} ", reader.NodeType, reader.Name, reader.Value);
            }
        }
        private static void ValidationCallBack(object sender, ValidationEventArgs e)
        {
            if (e.Severity == XmlSeverityType.Warning)
                Console.WriteLine("Warning: Matching schema not found.  No validation occurred." + e.Message);
            else // Error
                Console.WriteLine("Validation error: " + e.Message);
        }
    }
}

这会导致输出:

XmlDeclaration, xml: version="1.0" 
DocumentType, Product:  
Validation error: The 'Product' element is not declared.
Element, Product:  
Validation error: The 'ProductName' element is not declared.
Element, ProductName:  
Text, : Rugby jersey 
EndElement, ProductName:  
EndElement, Product: 

我已经尝试过在不同的位置有文件,我已经尝试过相对和绝对路径。我试图从微软网页复制一个例子,导致同样的问题。有人知道是什么问题吗?是否有任何方法可以查看程序是否能够加载dtd文件?

c#通过DTD验证读取XML

我不能评论,所以我在Jim的正确答案后面加上一个答案:

// SET THE RESOLVER
settings.XmlResolver = new XmlUrlResolver();

这是在。Net 4.5.1和。Net 4.5.2/。Net 4.6之间的一个突破性的变化。解析器以前默认设置为XmlUrlResolver。

你需要添加解析器

XmlReaderSettings settings = new XmlReaderSettings();
// SET THE RESOLVER
settings.XmlResolver = new XmlUrlResolver();
settings.ValidationType = ValidationType.DTD;
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
settings.IgnoreWhitespace = true;

只要两个文件在同一个目录中,这就可以工作。或者,您需要为DTD提供一个URL。

XmlUrlResolver也可以被覆盖,为解析过程提供额外的语义