我有一个引用本地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">
答案 0 :(得分: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);
将此架构添加到包含您正在验证的xml的XmlDocument
myXMLDocument.Schemas.Add(mySchema);
myXMLDocument.Schemas.Compile();
myXMLDocument.Validate(DTDValidation);
DTDValidation()
处理程序将包含代码,用于处理xml无效时的操作。