【问题标题】:C# XmL Serialization - setting items to attribute only shows integer in XMLC# XmL 序列化 - 将项目设置为属性仅在 XML 中显示整数
【发布时间】:2013-10-22 07:53:06
【问题描述】:

我有一个完整的构建对象列表,我想将它序列化为一个 XML 文件。基本序列化工作正常,但将值转换为属性以获得更好的可读性却奇怪地失败了,除了 int 值。

这是我正在使用的应该序列化的建筑类:

    public class building
    {
       [XmlAttribute]
       public string strName { set; get; }    //name
       [XmlAttribute]
       public int intCount { set; get; }      //count of building
       [XmlAttribute]
       public int intCost { set; get; }       //running cost of building
       [XmlAttribute]
       public string strProd { set; get; }    //product
       [XmlAttribute)]
       public string strRes1 { set; get; }    //first ressource required
       [XmlAttribute]
       public string strRes2 { set; get; }    //second ressource required
       [XmlAttribute]
       public int intTime { set; get; }       //time to build in seconds
    }

如果我省略 [XMLAttribute] 标签,XML 文件输出如下:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfBuilding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <building>
    <strName>Holzfäller</strName>
    <strKind>Produktion</strKind>
    <intCost>2</intCost>
    <strProd>Holz</strProd>
    <strRes1 />
    <strRes2 />
    <intTime>105</intTime>
  </building>

正如所说的那样很好,只是很难获得文件中超过 50 座建筑物的概览。使用上述代码创建的 XML 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfBuilding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <building intCount="0" intCost="0" intTime="0" />
  <building intCount="0" intCost="0" intTime="0" />

如您所见,仅添加了 int 值,甚至这些值也是 FALSE。所有值都设置为零。奇怪的是,如果我在创建列表后更新程序中的一个值,那么更改也会反映在 XML 中。只是基本值似乎被忽略/更改为零。

编辑:我也尝试像这样设置 DataType:

[XmlAttribute(DataType = "string")]

但这也只会使字符串变得噗噗而根本不显示。

有点迷失了这一点。如果我只是将 Attribute 的东西排除在外,那么一切都可以正常工作,所以我至少可以确定我的其余代码不会引起任何问题。但是为什么 XMLSerializer 会忽略作为字符串的对象属性并重置所有 int 值呢?我该如何改变?

很抱歉,如果其他地方有人问过这个问题,我找不到合适的词来让谷歌解决我的问题。主要是因为我不明白这里发生了什么,也不知道从哪里开始。我找到的文档只是显示了我在做什么,声称它会起作用。但这并不明显:-(

【问题讨论】:

  • 尝试指定属性like here的类型。
  • 已经尝试过了,字符串仍然会消失。我忘了说,对不起。编辑了我的帖子以反映这一点。
  • 如果您想在很大程度上提高可读性,您应该从属性中删除类型前缀并将类型信息存储在模式中。

标签: c# xml


【解决方案1】:

您的strings 为空,因此它们不与序列化一起写入。

building 的默认构造函数中将您的字符串字段初始化为string.Empty,它们将出现在输出中。

我在building 中使用此构造函数对其进行了测试:

public building()
{
    strProd = "";
}

输出:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfBuilding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <building intCount="0" intCost="0" strProd="" intTime="0" />
  <building intCount="0" intCost="0" strProd="" intTime="0" />
</ArrayOfBuilding>

为什么行为的属性不同?

Xml 能够通过省略内容在元素中显示可为空的类型。但是,属性不能显示可空值 以区别于空字符串。因此,该属性被完全省略。

【讨论】:

  • 我不确定我是否理解你。为什么我的字符串为空?我明白,有些是,因为在我的示例中,有些建筑物不需要外部资源。但大多数字符串根本不为空。 name 字段始终存在,就像 strProd 字段始终具有值一样。此外,如果我使用您的构造函数 strProd 将始终为“”,即使它应该为第一个建筑物读取“Holz”。我不希望空属性只是为了看到它们在那里......值也需要正确。使用您的构造函数时,属性会显示出来,这是一个好兆头。
  • 如果没有看到您的其余代码,我无法评论为什么字符串为空。默认情况下,字符串初始化为 null。关于 XML:默认情况下,XML 属性是可选的。请记住,格式是用于数据传输,而不是用于演示。当属性为空时删除属性会减小文件大小 - 一个有价值的目标!可以说,您应该尽可能将日期保留在元素中。
  • 实际上目前还没有更多的代码。现在我有上面列出的带有元素的 XML。我正在从该 XML 中提取并将这些对象放在我的列表中。然后我尝试将它放入另一个 XML 中,就像第一次一样,只是用属性代替元素。如果我没有偶然找到解决方案,我猜我只会坚持元素。让它更容易阅读不是必需的。这个问题的目标是基本上学习一些东西。没想到这是个问题,我只是想念一些明显的东西。感谢您的回答!
  • @Rattenmann 随时。希望您从讨论中有所收获。
猜你喜欢
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多