C# 根据字符串中的dtd验证xml

C# 根据字符串中的dtd验证xml,c#,xml,dtd,C#,Xml,Dtd,我有一个引用本地dtd文件的xml文件。但问题是我的文件被压缩成一个文件(我使用的是Unity3D,它将我所有的文本文件压缩成一个二进制文件)。这个问题不是Unity3D特有的,它对于试图从字符串加载DTD模式的任何人都很有用 我已经想到了一种解决方法,分别加载xml和dtd,然后将dtd文件添加到文档的XMLSchema中。像这样: private void ReadConfig(string filePath) { // load the xml file TextAsset

我有一个引用本地dtd文件的xml文件。但问题是我的文件被压缩成一个文件(我使用的是Unity3D,它将我所有的文本文件压缩成一个二进制文件)。这个问题不是Unity3D特有的,它对于试图从字符串加载DTD模式的任何人都很有用

我已经想到了一种解决方法,分别加载xml和dtd,然后将dtd文件添加到文档的XMLSchema中。像这样:

private void ReadConfig(string filePath)
{
    // load the xml file
    TextAsset text = (TextAsset)Resources.Load(filePath);
    StringReader sr = new StringReader(text.text);
    sr.Read(); // skip BOM, Unity3D catch!

    // load the dtd file
    TextAsset dtdAsset = (TextAsset)Resources.Load("Configs/condigDtd");

    XmlSchemaSet schemaSet = new XmlSchemaSet();
    schemaSet.Add(...); // my dtd should be added into this schemaset somehow, but it's only a string and not a filepath.

    XmlReaderSettings settings = new XmlReaderSettings() { ValidationType = ValidationType.DTD, ProhibitDtd = false, Schemas = schemaSet};
    XmlReader r = XmlReader.Create(sr, settings);

    XmlDocument doc = new XmlDocument();
    doc.Load(r);
}
xml是这样开始的,但是找不到dtd。这并不奇怪,因为xml文件是作为字符串加载的,而不是从文件加载的

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Scene SYSTEM "configDtd.dtd">

XmlSchema
有一个
Read
方法,该方法接受
流和
验证venthandler
。如果DTD是字符串,则可以将其转换为流

System.Text.Encoding encode = System.Tet.Encoding.UTF8;
MemoryStream ms = new MemoryStream(encode.GetBytes(myDTD));
创建XmlSchema

XmlSchema mySchema=XmlSchema.Read(ms,DTDValidation)

将此架构添加到包含要验证的xml的
XmlDocument

myXMLDocument.Schemas.Add(mySchema);
myXMLDocument.Schemas.Compile();
myXMLDocument.Validate(DTDValidation);

DTDValidation()
处理程序将包含处理xml无效时该怎么办的代码。

谢谢,它几乎可以正常工作。但是Mono正在抛出一个关于找不到的声明的xmlexception。如果我不在mono工作,我想这会起作用。所以,这一个竖起大拇指。我将尝试改用xsd文件。