2012-05-09 116 views
0

我有一個xml文件引用了一個本地dtd文件。但問題是我的文件被壓縮成單個文件(我使用的是Unity3D,它將我所有的文本文件放入一個二進制文件中)。這個問題不是Unity3D特有的,它對於任何試圖從字符串加載DTD模式的人都很有用。從字符串驗證xml針對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"> 

回答

2

XmlSchema具有Read方法,該方法在一個StreamValidationEventHandler。如果DTD是一個字符串,你可以把它轉換成流

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

創建的XmlSchema

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

添加此架構的XmlDocument包含您要驗證

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

DTDValidation()處理程序將包含代碼處理如果xml無效,該怎麼做。

+0

謝謝,它幾乎似乎工作。但是Mono正在拋出一個關於無法找到的聲明的幻想。我認爲這將工作,如果我不會在單聲道工作。所以贊成這個。我會嘗試使用xsd文件。 – Marnix