使用c#和vs2017无法使用DTD验证简单(或复杂)XML

问题描述 投票:0回答:1

我一直在努力尝试使用其关联的DTD文件验证XML文档。最初我尝试从(Micorsoft Article)转换示例,然后在另一篇Stack-Overflow文章(here)中阅读帖子。在这两种情况下(有效和无效的XML文档),简单的xml文件无法验证,我无法解决为什么...

我的测试应用程序是一个Windows窗体项目,它有一个单独的表单,上面有几个按钮,后面的代码......

bool isValid = true;
    StringBuilder xml = new StringBuilder();
    StringBuilder messages = new StringBuilder();
    string nl = Environment.NewLine;

    public FormMain()
    {
        InitializeComponent();
    }

    private void ValidateProductXMLButton_Click(object sender, EventArgs e)
    {
        ValidateXML("ProductWithDTD.xml");
        DisplayMessage();
    }

    private void ValidateItemXMLButton_Click(object sender, EventArgs e)
    {
        ValidateXML("ItemWithDTD.xml");
        DisplayMessage();
    }

    private void DisplayMessage()
    {
        MessageBox.Show("XML is " + (isValid ? "" : "NOT ") + "valid" + nl + nl + "Message:" + nl + messages.ToString() + nl + nl + "XML" + nl + xml.ToString());

        isValid = true;
        messages = new StringBuilder();
        xml = new StringBuilder();
    }

    protected void ValidateXML(string xmlFileName)
    {
        try
        {
            XmlReaderSettings xmlSettings = new XmlReaderSettings()
            {   
                DtdProcessing = DtdProcessing.Parse,
                ValidationType = ValidationType.DTD
            };
            xmlSettings.ValidationEventHandler += new ValidationEventHandler(ValidationCallback);

            XmlReader reader = XmlReader.Create(AppDomain.CurrentDomain.BaseDirectory + xmlFileName, xmlSettings);
            while (reader.Read())
            {
                // nothing to do, just validating the xml packet
                xml.AppendLine(reader.ReadOuterXml());
            }
            reader.Close();
        }
        catch (Exception ex)
        {
            messages.AppendLine("ERROR : " + ex.Message);
            isValid = false;
        }
    }

    private void ValidationCallback(object sender, ValidationEventArgs e)
    {
        isValid = false;
        messages.AppendLine(e.Message);
    }

除了上面的代码,我的2个XML文件(一个有效,一个没有)和我的DTD文件的内容如下所示......

ProductWithDTD.xml

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

ItemWithDTD.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Product SYSTEM "Product.dtd">
<Item ItemID="123">
    <ItemName>Rugby jersey</ItemName>
</Item>

最后,Product.dtd ......

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

即使在处理ProductWithDTD.xml文件时,我也会收到验证错误,指出未声明Product和ProductName元素。我希望在ItemWithDTD.xml文件中,但不是ProductWithDTD.xml文件。

有没有人有任何想法为什么失败?这一切都在准备验证cXML EDI数据包(这也是无法正常工作),而且它们是要验证的更大的文档。

谢谢。

c# xml validation dtd cxml
1个回答
0
投票

事实证明,XmlReader实际上定位DTD文件以进行验证存在问题,即使它是本地文件也是如此。

更改XmlReaderSettings的定义以包含默认的XmlResolver解决了我的问题。

            XmlReaderSettings xmlSettings = new XmlReaderSettings()
            {   
                DtdProcessing = DtdProcessing.Parse,
                ValidationType = ValidationType.DTD,
                XmlResolver = new XmlUrlResolver()
            };
© www.soinside.com 2019 - 2024. All rights reserved.