-1

ローカルの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">
4

1 に答える 1

2

XmlSchemaとをRead取り込むメソッドがStreamありValidationEventHandlerます。DTDが文字列の場合、ストリームに変換できます

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

XmlSchemaを作成する

XmlSchema mySchema = XmlSchema.Read(ms, DTDValidation);

XmlDocument検証しているxmlを含むこのスキーマを追加します

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

DTDValidation()ハンドラーには、xmlが無効な場合の処理​​を処理するコードが含まれます。

于 2012-05-09T11:15:00.663 に答える