ローカルのdtdファイルを参照するxmlファイルがあります。しかし、問題は私のファイルが単一のファイルに圧縮されていることです(私はUnity3Dを使用しており、すべてのテキストファイルを1つのバイナリに入れます)。この質問はUnity3D固有のものではなく、文字列からDTDスキーマを読み込もうとする人に役立ちます。
xmlをロードしてdtdを個別にロードしてから、ドキュメントのXmlSchemasにdtdファイルを追加する回避策を考えました。そのようです:
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">