如何通过强制创建所有必需元素来执行 XML 序列化

发布于 2024-11-28 14:12:40 字数 827 浏览 0 评论 0原文

我已经使用 xsd-tool 从某些 xml 方案生成了 cs-classes。 该方案是从 uml 类描述生成的非常复杂的方案。 现在我编写了一个简单的测试来确保生成的 xsd 类的功能。 该测试使用 XmlSerializer 创建 xml 文件。

在我的 XSD 方案中,有一些强制性元素(xsd 默认使用 minocc=1maxocc=1 进行定义)。

例如(简化):

<xs:element name="order">
    <xs:complexType>
       ...
         <xs:element name="orderId" type="string"/>
         <xs:element name="material" type="Material"/>
       ...
    <xs:complexType>

Material 是一个复杂类型,由多个元素组成。这是订单的一部分。

这些元素应始终存在于生成的 xml 文件中,即使它们为空或仅包含空元素。现在,如果我将类实例序列化为 xml 文件,则只有类属性包含值的元素才会出现。如果我设置 orderId,则会显示 orderId 元素,但不会显示材料元素,因为在我的类实例中它为 null。因此,我的 xml 文件对于 xsd 架构无效。

您知道如何在序列化过程中使用我的 xsd 文件验证生成的 xml 文件吗?有没有办法告诉 XmlSerializer 它应该始终生成必需元素(可能具有默认值)? 或者有没有办法验证应该序列化的类实例的结构?

i have generated a cs-classes with the xsd-tool from some xml scheme.
The scheme is a very complex scheme generated from uml-class descriptions.
Now I have written a simple test to ensure the functionality of the generated xsd-classes.
The test uses XmlSerializer to create the xml-file.

In my XSD-scheme there are some obligatory elements (definition with minocc=1 and maxocc=1 by xsd-default).

For example (simplified):

<xs:element name="order">
    <xs:complexType>
       ...
         <xs:element name="orderId" type="string"/>
         <xs:element name="material" type="Material"/>
       ...
    <xs:complexType>

Material is a complex type, which consists of several elements. It is part of order.

These elements should always exists in the resulting xml-file, even if they are empty or contains only empty elements. Now, if I serialize a class instance to an xml-file, only the elements appear where the class-propertys contain a value. If I set orderId the orderId-element appears, but not the material-element because in my class instance it's null. As a result my xml-file is not valid to the xsd-schema.

Do you have an idea how i can validate the resulting xml-file with my xsd file during serialization? Is there a way to tell XmlSerializer that it should always generate obligatory elements (perhaps with a default value)?
Or is there a way to validate the structure of the class instance that should be serialized?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

隔纱相望 2024-12-05 14:12:40

您无法自动生成元素来满足您所需的规则。
关于第二个问题,您可以使用 XmlReader 和 XmlSchema 对象验证生成的 xml。
一个小例子如下所示:

        public IList<string> Validate(TextReader reader, XmlSchema schema)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add(schema);
            settings.ValidationType = ValidationType.Schema;

            List<string> errors = new List<string>();

            settings.ValidationEventHandler += (sender, e) =>
            {
                errors.Add(string.Format("Line {0} at position {1}{2}{3}",
                        e.Exception.LineNumber, e.Exception.LinePosition,
                                    Environment.NewLine, e.Message));
            };


            XmlReader xmlReader = XmlReader.Create(reader, settings);
            while (xmlReader.Read()) { };

            return errors;
        } 

此示例采用一个 TextReader(可以是 StreamReader、StringReader 等)和一个 XmlSchema 对象(您可以从 xsd 文件或其他文件构造一个对象 - 检查它的文档)并返回一个列表验证错误。

You cannot generate automatically elements to fulfill your required rules.
On your second question you can validate the generated xml with XmlReader and XmlSchema objects.
A small example would look like this:

        public IList<string> Validate(TextReader reader, XmlSchema schema)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add(schema);
            settings.ValidationType = ValidationType.Schema;

            List<string> errors = new List<string>();

            settings.ValidationEventHandler += (sender, e) =>
            {
                errors.Add(string.Format("Line {0} at position {1}{2}{3}",
                        e.Exception.LineNumber, e.Exception.LinePosition,
                                    Environment.NewLine, e.Message));
            };


            XmlReader xmlReader = XmlReader.Create(reader, settings);
            while (xmlReader.Read()) { };

            return errors;
        } 

This example takes a TextReader (can be a StreamReader, StringReader etc. ) and an XmlSchema object (you can construct one from the xsd file or whatever - check the documentation for it) and returns a list of validation errors.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文