代码之家  ›  专栏  ›  技术社区  ›  Kjara

序列化期间验证xml

  •  0
  • Kjara  · 技术社区  · 6 年前

    这篇文章 https://stackoverflow.com/a/1708614/5333340 给出了在反序列化过程中如何验证xml的解决方案。它还说可以为序列化编写类似的代码,但我没有弄清楚。

    有人能给个提示吗?

    我想在序列化过程中进行验证,这样,如果验证在某个点失败,序列化就会立即停止。


    根据链接的答案,我的反序列化代码(进行验证的地方)如下所示:

    private static readonly XmlSerializer _topSerializer = new XmlSerializer(typeof(top));
    private static readonly XmlSettings _settings = ...
        // same as in the linked post, only without `ValidationEventHandler` set
    
    public static top Deserialize(Stream strm)
    {
        using (StreamReader input = new StreamReader(strm))
        {
            using (XmlReader reader = XmlReader.Create(input, _settings))
            {
                return (top)_topSerializer.Deserialize(reader);
            }
        }
    }
    

    班级 top 是表示xml模式根元素的类;我用xsd.exe文件.

    这非常有效;当xml不符合模式时,我得到一个 XmlSchemaValidationException .


    为了将这种方法转移到我当前的序列化代码中 (在没有进行验证的情况下),如下所示

    public static void Serialize(top t, Stream strm)
    {
        using (XmlWriter wr = XmlWriter.Create(strm))
        {
            _topSerializer.Serialize(wr, t);
        }
    }
    

    ,我需要把 XmlReader 在某个地方,因为它是 XML阅读器 这是验证所需要的。 但是在哪里,怎么做?这个 XmlReader.Create 方法需要 TextReader 或者 Stream 作为输入,所以我假设在 XML阅读器 我能读懂。所以呢

    using (XmlReader reader = XmlReader.Create(strm, _settings))
    {
        using (XmlWriter wr = XmlWriter.Create(strm))
        {
            _topSerializer.Serialize(wr, t);
        }
    }
    

    不会验证生成的xml,因为流通过 XML阅读器 . 只有在调用 _topSerializier.Serialize ,所以在它之后阅读是有意义的。但是,在里面放什么呢?

    using (XmlWriter wr = XmlWriter.Create(strm))
    {
        _topSerializer.Serialize(wr, t);
    
        using (XmlReader reader = XmlReader.Create(strm, _settings))
        {
            // what to do here?
        }
    }
    

    (此代码也不验证。)

    0 回复  |  直到 6 年前