【问题标题】:C# XML reader doesn't get the value from child nodes [duplicate]C# XML阅读器没有从子节点获取值[重复]
【发布时间】:2021-06-12 12:46:45
【问题描述】:

我有一个包含要读取的子节点的 xml 文件。 当我反序列化对象时,我不会从子节点获取值,它始终为 0。

XML 文件示例:

<?xml version="1.0" encoding="utf-8"?>
<Pieces Rapport="0" Employee="">
  <Piece Roll="1" Piece="1" Amount="1" Length="1.00" />
  <Piece Roll="1" Piece="1" Amount="1" Length="2.00" />
  <Piece Roll="1" Piece="1" Amount="1" Length="3.00" />
  <Piece Roll="1" Piece="1" Amount="1" Length="0" />
  <Piece Roll="1" Piece="1" Amount="1" Length="0" />
</Pieces>

我用[XmlElement] 标签标记了我的课程,如下所述:How to deserialize xml to object

类:

  [XmlRoot("Pieces")]
public class StukLijst
{
    [XmlElement("Rapport")]
    public string rapport { get; set; }
    [XmlElement("Employee")]
    public string employee { get; set; }
    [XmlElement("Piece")]
    public List<StukRow> stukLijst { get; set; }
}

 public class StukRow
{
    [XmlElement("Roll")]
    public int rol { get; set; }
    [XmlElement("Piece")]
    public int stuk { get; set; }
    [XmlElement("Amount")]
    public int banen { get; set; }
    [XmlElement("Length")]
    public double lengte { get; set; }
}

读取xml文件:

private void LoadXml(string pickListNumber, string lineNumber)
    {
        string path = filePath + pickListNumber + "_" + lineNumber + ".xml";
        StreamReader xmlStream = new StreamReader(path);
        XmlSerializer serializer = new XmlSerializer(typeof(StukLijst));
        StukLijst result = (StukLijst)serializer.Deserialize(xmlStream);
    }

结果如下:

那么为什么 Employee 是 null 而子节点都是 0? 似乎它可以找到孩子,但没有从他们那里获取数据。 有什么解决办法吗?

【问题讨论】:

  • 你不是在混合元素和属性吗?新的 XML 节点是一个元素,但 RapportEmployee 不是新的 XML 节点,而是现有 Pieces 节点/元素的属性

标签: c# xml


【解决方案1】:

您在StukRow 的每个属性中都使用了[XmlElement],但数据不在XML 元素中——它在XML 属性 中。试试这个:

public class StukRow
{
    [XmlAttribute("Roll")]
    public int rol { get; set; }
    [XmlAttribute("Piece")]
    public int stuk { get; set; }
    [XmlAttribute("Amount")]
    public int banen { get; set; }
    [XmlAttribute("Length")]
    public double lengte { get; set; }
}

同样,StukLijst 中的 rapportemployee 属性应使用 [XmlAttribute] 进行修饰,因为数据存储在 XML 属性中,而不是子元素中。

作为旁注,我强烈建议您开始为您的属性遵循 .NET 命名约定,使用 PascalCased 名称(例如 RolStuk 等)

【讨论】:

  • 正确。我应该使用 XmlAttribute。
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2013-08-12
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多