【问题标题】:C# How to xml serialize complex type as a xml attribute?C#如何将复杂类型xml序列化为xml属性?
【发布时间】:2018-12-06 19:04:44
【问题描述】:

我想使用 XmlSerializer 序列化一个类,典型的东西。 我的一个区别是我想将自定义对象“ComplexType”序列化为属性,而不是子元素。

我看过其他堆栈溢出问题,答案说这是不可能的。我知道那是错误的。

错误是这样的:

“XmlAttribute/XmlText 不能用于编码复杂类型。”

--或--

"XmlAttribute/XmlText 不能用于编码类型实现 IXmlSerializable。”

只需将 myfield 从 ComplexType 更改为 DateTime 即可。 DateTime 肯定很复杂,所以我只需要知道在类或属性中要更改什么即可。

例如:是的

<Container myComplexType="specialencoding" />

例如:否

<Container>
   <myComplexType>specialencoding</myComplexType>
</Container>

-- 看看第一个有多好......我想要那个。

-- 代码是这样的……

[XmlRoot(ElementName="Container")]
public class Container
{
  [XmlAttribute(AttributeName="myComplexType")]
  public ComplexType myfield = new ComplexType();
}


public class ComplexType
{
    public ComplexType(){}
    public ComplexType(string encoding){}
    public override string ToString() {return "specialencoding";}
}

如果我实现 ComplexType : IXmlSerializable,我会收到上面的第二条错误消息。

使用的基本序列化程序:

XmlSerializer serializer = new XmlSerializer(typeof(Container));
serializer.serialize("outfile.xml", new Container());

【问题讨论】:

  • Xml 属性是一个字符串。当您将 XmlAttribute 设为 DateTime 时,它​​会变成带双引号的字符串。如果它很复杂,那么 DateTime 周围就不会有引号。
  • 对,我可以将我的类型转换为简单的字符串/从简单的字符串转换,所以我希望能够表现得像 DateTime 并写入属性 - 带引号。
  • 我见过其他堆栈溢出问题,答案说这是不可能的。我知道那是错误的。 - 您能否分享不符合您要求的答案,以免我们重复努力?
  • 架构类型 xs:dateTime 是简单类型,不是复杂类型。 XSD 中的复杂类型是包含元素和字符内容的类型。简单地拥有一个内部微语法并不会使它变得复杂。

标签: c# xml serialization xml-serialization


【解决方案1】:

试试这个:

        private ComplexType _myfield = new ComplexType();

        [XmlAttribute(AttributeName = "myComplexType")]
        public string myfield {
            get { return _myfield.ToString();}
        }
    }
    public class ComplexType
    {
        public ComplexType(){}
        public ComplexType(string encoding){}
        public override string ToString() {return "specialencoding";}
    }

【讨论】:

  • 对,这就是其他问题的答案。如果我有一堆属性,我不想做 2x 代码,添加/删除字段也是如此。 DateTime 可以做的很好,那它是怎么回事?
  • 要被XmlSerializer序列化,属性myfield必须是读/写的。
  • @extracrispy - 来自docs您只能将 XmlAttributeAttribute 分配给返回值(或值数组)的公共字段或公共属性,该值可以映射到其中一个XML 架构定义语言 (XSD) 简单类型...有关 XSD 类型的列表以及它们如何映射到 .NET 数据类型,请参阅 DataType 属性。
  • @extracrispy - 以及来自XmlAttributeAttribute.DataType 的文档,只有已知的.Net 原语被映射到XSD 简单数据类型。没有记录使用其ToString() 映射任意类型。
  • @dbc 哦,“XSD”简单类型。我误读了原始文档,并认为它是 C# 简单/原始类型。哇,好的。也许有一些方法可以通过一些隐式转换运算符来完成它?
猜你喜欢
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多