English 中文(简体)
问题鉴定
原标题:Problem validation a XML file with a local DTD file in C#
  • 时间:2009-10-02 10:36:51
  •  标签:

为核实XML档案,我 tri笑。 使用该守则

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.ValidationType = ValidationType.DTD;

settings.ValidationEventHandler += new ValidationEventHandler(validationError);        

XmlSchemaSet schemas = new XmlSchemaSet();
settings.Schemas = schemas;
XmlReader reader = XmlReader.Create(lblXmlPath.Text, settings);

reader.Settings.Schemas.Add(null, lblDTDPath.Text);
while (reader.Read())
{ 
          // empty by now
}
reader.Close();

但是,在“接近”的行文中。 情况。 Schemas.Add(null, lblDTDPath.Text);“视频演播室”向我显示,“出于安全原因,DTD在XML文件中被禁止。 为了便于DTD处理,在XmlReaderSettings上设定了禁止开发的财产,使之伪造,并将环境带入XmlReader。 创造方法”

如你在法典中看到的那样,ProhibitDtd被定作假(我也在辩论期间核实)。 我还试图在打电话给XmlReader之前添加Schema。 创造没有成功。

问题回答

此前,我曾多次确认RSS的饲料。 由当地储存的DTD进行验证的方法是,在<代码>XmlResolver上插入一个习惯代码

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.ValidationType = ValidationType.DTD;
readerSettings.ProhibitDtd = false;
readerSettings.XmlResolver = new XmlFakeDtdResolver();

这将使读者了解当地TD(已知格式),而不是从DOCTYPE提供的URL下载。

class XmlFakeDtdResolver : XmlUrlResolver
{
    public static Dictionary<Uri, byte[]> dtdMap = new Dictionary<Uri, byte[]>();
    public static Dictionary<string, Uri> uriMap = new Dictionary<string, Uri>();
    static XmlFakeDtdResolver()
    {
        Uri rss091uri = new Uri("http://fake.uri/rss091");
        uriMap["-//Netscape Communications//DTD RSS 0.91//EN"] = rss091uri;
        uriMap["http://my.netscape.com/publish/formats/rss-0.91.dtd"] = rss091uri;
        dtdMap[rss091uri] = Encoding.ASCII.GetBytes(Resources.rss_0_91dtd);
    }

    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
    {
        if (dtdMap.ContainsKey(absoluteUri) && ofObjectToReturn == typeof(Stream))
        {
            return new MemoryStream(dtdMap[absoluteUri]);
        }
        return base.GetEntity(absoluteUri, role, ofObjectToReturn);
    }

    public override Uri ResolveUri(Uri baseUri, string relativeUri)
    {
        if (uriMap.ContainsKey(relativeUri))
            return uriMap[relativeUri];
        return base.ResolveUri(baseUri, relativeUri);
    }
}

作为最后说明,我决定不在最后使用DTD验证,然后由XML扫描仪进行验证,原因之一是许多饲料中含有DOCTYPE。

在请XmlReader之前,请你在DTD s中添加图象收集。 创建。

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.ValidationType = ValidationType.DTD;

settings.ValidationEventHandler += new ValidationEventHandler(validationError);        

XmlSchemaSet schemas = new XmlSchemaSet();

schemas.Add(null, lblDTDPath.Text);
settings.Schemas = schemas;

XmlReader reader = XmlReader.Create(lblXmlPath.Text, settings);

while (reader.Read())
{ 
          // empty by now
}
reader.Close();

从我手脚看,唯一能够工作的方式是,不要在<代码>上添加图象。 XmlReader。 xml文件中规定的DTD必须是有效的,XmlReader将每次下载。

如果你需要把玉米作为本地人的话,你可以改变德赖特的ur子,用定期的表述把它点到地方档案中,这样它就能够看上像样。

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN" "file:C:wml.dtd">

Note the file: in the url. 在将其转交XmlReader之前,这样做是记忆犹豫的,因此,你不必修改xml的档案,以使之变换正确。

我也存在同样的问题。 对我来说,答案是,在XML档案中,必须从Schemas那里发现,DTD确实没有需要被忽略,而通过图象引起我的问题。





相关问题
热门标签