我有一个引用本地 dtd 文件的 xml 文件。但问题是我的文件被压缩成一个文件(我正在使用 Unity3D,它将我所有的文本文件都放入一个二进制文件中)。这个问题不是 Unity3D 特定的,它对任何试图从字符串加载 DTD 模式的人都很有用。
我想到了一种解决方法来加载 xml 并分别加载 dtd,然后将 dtd 文件添加到我的文档的 XmlSchemas 中。像这样:
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">