【问题标题】:Validate xml against dtd from string根据字符串验证 xml
【发布时间】:2012-05-09 19:15:00
【问题描述】:

我有一个引用本地 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">

【问题讨论】:

    标签: c# xml dtd


    【解决方案1】:

    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 无效时要执行的操作的代码。

    【讨论】:

    • 谢谢,它似乎几乎可以工作了。但是 Mono 抛出了一个关于无法找到的声明的 xmlexception。如果我不使用单声道,我认为这会起作用。所以为这个竖起大拇指。我将尝试改用 xsd 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    相关资源
    最近更新 更多