在 C# 中使用 xsi:nil="true" 反序列化 XML 元素

2024-02-25

我正在尝试反序列化 XML 文件XmlSerializer in C#.

随后的目标类是使用 xsd 实用程序自动生成的。

    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
    public partial class location
    {

        private string cityField;

        private string countryField;

        private string stateField;

        private string textField;

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string city
        {
            get
            {
                return this.cityField;
            }
            set
            {
                this.cityField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string country
        {
            get
            {
                return this.countryField;
            }
            set
            {
                this.countryField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string state
        {
            get
            {
                return this.stateField;
            }
            set
            {
                this.stateField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Text
        {
            get
            {
                return this.textField;
            }
            set
            {
                this.textField = value;
            }
        }
    }

一切正常,直到我到达文件的这一部分:

<locations>
    <location country="PARAGUAY" city="Ciudad del Este" state="Alto Parana" xsi:nil="true"/>
    <location country="BRAZIL" city="Passo Fundo" state="Rio Grande do Sul" xsi:nil="true"/>
</locations>

As MSDN 中指出 https://msdn.microsoft.com/en-us/library/ybce7f69(v=vs.100).aspx#Anchor_2, xsi:nil="true" 的元素将被反序列化为空对象,完全丢失所有属性。在 C# 中,这会转换为空对象。

有没有办法改变这种行为,以便反序列化这三个属性?

预先感谢您的任何建议!

EDIT 1:

这是关联的命名空间:

<records xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="structure.xsd">
    (location is within here somewhere)
</records>

如果您只是想丢弃xsi:nil属性、集合XmlElementAttribute.IsNullable = false https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.isnullable.aspx in the [XmlElement]引用的包含类中的属性上的属性location。 例如。如果你有

[System.Xml.Serialization.XmlRootAttribute("locations", Namespace = "")]
public class LocationList
{
    [XmlElement("location", IsNullable = true)]
    public List<location> Locations { get; set; }
}

手动修改为:

[System.Xml.Serialization.XmlRootAttribute("locations", Namespace = "")]
public class LocationList
{
    [XmlElement("location", IsNullable = false)]
    public List<location> Locations { get; set; }
}

如果你想bind的值xsi:nil同时绑定到其他属性值,除了设置IsNullable = false,您可以按照中所示的方式添加手动属性我可以在由 XSD C# 生成的类创建的 XML 中的同一标记处包含 null 属性和其他属性吗? https://stackoverflow.com/questions/32903839/can-i-have-null-attribute-and-other-attribute-at-the-same-tag-in-xml-created-by:

public partial class location
{
    bool nil;

    [XmlAttribute("nil", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public bool Nil
    {
        get
        {
            return nil;
        }
        set
        {
            nil = value;
        }
    }

    public bool ShouldSerializeNil() { return nil == true; }
}

Sample fiddle https://dotnetfiddle.net/LQOZDQ.

您还可以对 XML 进行预处理和后处理以重命名xsi:nil属性,如建议的那样这个答案 https://stackoverflow.com/questions/32903839/can-i-have-null-attribute-and-other-attribute-at-the-same-tag-in-xml-created-by/32969557#32969557.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中使用 xsi:nil="true" 反序列化 XML 元素 的相关文章

随机推荐

  • Google Cloud ML Engine 错误 429 内存不足

    我将模型上传到 ML engine 当尝试进行预测时 我收到以下错误 ERROR gcloud ml engine predict HTTP request failed Response error code 429 message Pr
  • 将数组的内容打印为字符串

    我正在尝试编写一个小函数 它接受整数数据并将其转换为 char 数组内的十六进制值 我想做的是 取int数组数据 将其转换为另一个数组中的十六进制 将十六进制数组的内容转换为字符串 打印字符串的内容 int main int data 40
  • phpmailer如何向两个不同的用户发送两条不同的消息

    我正在向两个不同的人发送邮件 两封不同的消息 一封发送给用户 一封发送给管理员 message1 hello user message2 hello admin email email protected cdn cgi l email p
  • Clojure 测试框架的优势?

    您更喜欢哪一个 为什么 各自的优点和缺点是什么 在什么情况下 每个人都比其他人更胜一筹 我对 midje 与 clojure test 特别感兴趣 但也可以随意提出其他 Clojure 测试框架 也可以看看Clojure 的最佳单元测试框架
  • 在静态方法中在 UIView 上用清晰的颜色绘制(切一个洞)

    我有一个iPhone应用程序 我需要实现以下方法 UITextView textView UITextView withCuttedRect CGRect r 此方法必须剪切 填充 UIColor clearColor 矩形r from U
  • 在同一套接字上并行调用 send/recv 是否有效?

    我们可以在同一个套接字上从一个线程调用 send 并从另一个线程调用 receive 吗 我们可以从同一套接字上的不同线程并行调用多个发送吗 我知道好的设计应该避免这种情况 但我不清楚这些系统 API 的行为方式 我也找不到同样的好的文档
  • 表单不提交动态生成的输入(jQuery)

    您好 我正在尝试为我的表单动态生成一些输入 但它没有发布生成的新输入 到目前为止我一直在四处搜索 我唯一能找到的就是使表单成为body 标签 并且在我的应用程序的设计中这是不可能的 所以有人可能知道会发生什么以及如何解决它 不 它不适用于
  • 如何在 Visual Studio Code 中显示 Jupyter Notebook 中的所有输出?

    在 VS Code 中的 Jupyter Notebook 中 当我运行在某个时刻打印大量输出的代码时 剩余的输出将被抑制并显示一条消息 显示更多 在文本编辑器中打开原始输出数据 如何使所有输出可见 我认为你在这里使用内部构建是正确的设置
  • Flink:处理数据早于应用程序水印的键控流

    我正在使用带有运动源和事件时间键控窗口的 F link 该应用程序将监听实时数据流 窗口 事件时间窗口 并处理每个键控流 我有另一个用例 我还需要能够支持某些关键流的旧数据的回填 这些将是事件时间 鉴于我正在使用水印 这会成为一个问题 因为
  • Azure Functions - Blob 流动态输入绑定

    我正在 azure 上运行一个 C 函数 它需要从容器中获取文件 唯一的问题是输入文件的路径每次都会 可能 不同 并且输入文件的数量将从 1 到大约 4 或 5 不等 因此 我不能只使用默认的输入 blob 绑定据我所知 我的选择是给予容器
  • 通过Ajax发送FormData + js变量

    我有这个 Ajax 来发送多个图像 btn on click function var formData new FormData form1 0 var path php upload adm prodpictures php ajax
  • 如何转到 Eclipse 中的“下一个出现”

    在 Eclipse 中 您可以打开 标记出现次数 然后它将突出显示当前范围内给定变量的每次出现 那太好了 但我真的很想从一次这样的事件转移到下一次 到目前为止 我已经找到了两个关于如何执行此操作的建议 但都没有奏效 首先有这样的帖子 Ecl
  • 使用 configparser 添加注释

    我可以使用 python 中的 ConfigParser 模块使用 add section 和 set 方法创建 ini 文件 请参阅示例http docs python org library configparser html http
  • 调试 $rootScope:infdig

    这是一个常见问题 已达到 5 次 digest 迭代 流产 观察者在最近 5 次迭代中被解雇 文档 https docs angularjs org error https docs angularjs org error rootScop
  • 自动更新 HTML 画布宽度和高度属性

    我想将 HTML5 画布与 Flexbox 结合使用 当用户调整窗口大小时 我需要自动设置 canvas width 和 canvas height 我尝试使用 jQuery 来实现 cnvs attr width cnvs width c
  • “Google_Exception”,消息为“经过身份验证后无法添加服务”

    我正在使用 Oauth 2 0 开发带有 Google Analytics 的 WP 插件 我所有的身份验证和数据提取都工作正常 除了这个问题 第一次获得新的 Google 授权代码 例如 4 xbSbg 并进行身份验证 然后尝试调用new
  • 我可以在 AngularJS 中要求通用父指令吗

    子指令是否可以在不确切知道父指令是什么的情况下需要父指令 而只是知道它 实现了一个接口 例如
  • 如何多次重用相同的代码 - html/css

    我想为每个按钮重复使用模式两次 按钮代码 function popUp model const pop up model document getElementById model pop up model classList toggle
  • TypeScript 合并通用数组

    我想要一个对象的通用对象数组 但是 它生成联合类型 如何获得一种合并对象类型 喜欢 key string boo string foo string type PluginType
  • 在 C# 中使用 xsi:nil="true" 反序列化 XML 元素

    我正在尝试反序列化 XML 文件XmlSerializer in C 随后的目标类是使用 xsd 实用程序自动生成的 System CodeDom Compiler GeneratedCodeAttribute xsd 4 0 30319