【问题标题】:C# read XML with DTD verificationC# 读取带有 DTD 验证的 XML
【发布时间】:2015-12-17 19:58:42
【问题描述】:

我正在尝试读取带有 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>

test.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# xml dtd


    【解决方案1】:

    我无法发表评论,所以我在 Jim 的正确答案中添加了一个答案:

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

    这是 .Net 4.5.1 和 Net 4.5.2 / .Net 4.6 之间的重大变化。解析器之前默认设置为 XmlUrlResolver。被这个坑了。

    【讨论】:

    • 这是完全合格的版本:settings.XmlResolver = new System.Xml.XmlUrlResolver();。我也想知道为什么我的验证在升级到代码后停止工作。
    【解决方案2】:

    您需要添加解析器。

    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 也可以被覆盖以为解析过程提供额外的语义。

    【讨论】:

    • 嗨@Jim,我们应该如何提供 DTD 的 URL?是不是通过settings.XmlResolver = new XmlUrlResolver(); ?
    • 如果我记得 DTD 的 url 需要在 xml 文件中。 https://www.w3.org/Consortium/Offices/Presentations/DTD/slide6-0.htm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多