簡體   English   中英

根據DTD驗證XML-找不到預期的標記

[英]Validate XML against DTD - expected markup not found

我知道這里也有類似的問題。 不幸的是,我找不到任何能給我答案的東西。 我正在嘗試針對現有DTD文件驗證XML,但是我的代碼不斷拋出

找不到預期的DTD標記。 1號線位置1。

XML如下所示(僅頭部,縮寫):

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE tms PUBLIC "-//Schema//DTD DocuMan TMS V5//EN" "Tms.dtd"[]>
<tms name=...

這就是所引用的DTD的外觀(開頭是注釋的版權,已省略,為便於閱讀起見縮寫):

<!ENTITY % para 'p|codeblock|procedural-instructions'>
<!ENTITY % list '(ul|ol)'>
...
...
<!-- simple reference to original dtd -->
<!ENTITY % ST4.dtd SYSTEM "ST4.dtd">
%ST4.dtd;
...
...
<!ELEMENT tms (tmsnode|node|rtf)*>
<!ATTLIST tms
...
...

引用的第二個DTD如下所示:

<!ENTITY lt    "&#38;#60;"> <!-- < -->
<!ENTITY gt    "&#38;#62;"> <!-- > -->
<!ENTITY amp   "&#38;#38;"> <!-- & -->
...
...
<!ELEMENT comment (#PCDATA| br | tab)*>
...
...

如果您想知道的話,所有DTD都沒有額外的“ DOCTYPE”元素。

這是我針對DTD讀取/驗證XML文件的代碼:

var xml = new XmlDocument();
try
{
    xml.Load(fil);
    var settings = new XmlReaderSettings
    {
        DtdProcessing = DtdProcessing.Parse,
        ValidationType = ValidationType.DTD,
        XmlResolver = new XmlUrlResolver()
    };
    var context = new XmlParserContext(xml.NameTable,
        new XmlNamespaceManager(xml.NameTable),
        xml.DocumentType.Name, "", xml.DocumentType.PublicId, xml.DocumentType.SystemId, "", "en", XmlSpace.Default);
    using (var reader = XmlReader.Create(fil, settings, context))
    {
        try
        {
            while (reader.Read()){}
        }
        catch (Exception except)
        {
            bkwValidate.ReportProgress(index, Path.GetFileName(fil) + ": " + except.Message);
        }
    }
}
catch (Exception exception)
{
    bkwValidate.ReportProgress(index, Path.GetFileName(fil) + ": " + exception.Message);
}

更新

原來我在此搜索過的代碼中存在錯誤:XmlParserContext的參數順序不正確。 internalSubset的空字符串需要在sysId之后。 現在,這使我更進一步:

var context = new XmlParserContext(xml.NameTable,
    new XmlNamespaceManager(xml.NameTable),
    xml.DocumentType.Name,xml.DocumentType.PublicId, xml.DocumentType.SystemId, "","", "en", XmlSpace.Default);

不幸的是,我現在陷入一個錯誤

不能有多個DTD

Heureka!

麻煩在於XmlParserContext:它太詳細了!

如果我只考慮最基本的需求,即使有多個DTD,它也可以正常工作:

var xml = new XmlDocument();
try
{
    xml.Load(fil);
    var settings = new XmlReaderSettings
    {
        DtdProcessing = DtdProcessing.Parse,
        ValidationType = ValidationType.DTD,
        XmlResolver = new XmlUrlResolver(),
        NameTable = xml.NameTable
    };

    var context = new XmlParserContext(xml.NameTable, new XmlNamespaceManager(xml.NameTable), "en",
        XmlSpace.Preserve);

    using (var reader = XmlReader.Create(fil, settings, context))
    {
        try
        {
            while (reader.Read()) { }
        }
        catch (Exception except)
        {
            bkwValidate.ReportProgress(index, Path.GetFileName(fil) + ": " + except.Message);
        }
    }
}
catch (Exception exception)
{
    bkwValidate.ReportProgress(index, Path.GetFileName(fil) + ": " + exception.Message);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM