【问题标题】:Add XML Attribute to serialized class property将 XML 属性添加到序列化的类属性
【发布时间】:2018-05-01 16:13:51
【问题描述】:

我看过一个使用包装类来执行此操作的示例,但我想知道是否有更好(更简单)的方法。

我的课如下:

public class PartData
{
  public List<PartInfo> PartList { get; set; }
}


public class PartInfo
{
  public string PartNumber { get; set; }

  public string OEMNumbers { get; set; }

  public List<VehicleApplication> VehicleApplications { get; set; }
}


public class VehicleApplication
{

  public string Year { get; set; }

  public string Make { get; set; }

  public string Model { get; set; }
}

序列化代码:

//serialize
private void serialize()
{
   PartData p = GetParts();
   SerializeClass(p);
}

public void SerializeClass(object instance)
{
  var serializer = new XmlSerializer(typeof(PartData));

  using (var writer = new StreamWriter("C:\\TestFile.xml"))
  {
    serializer.Serialize(writer, instance);
  }
}

当序列化时,我得到以下输出:

 <PartData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PartList>
    <PartInfo>
      <PartNumber>12345</PartNumber>
      <OEMNumbers>14556, 14557, 14558, 14559</OEMNumbers>
      <VehicleApplications>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
      </VehicleApplications>
    </PartInfo>
  </PartList>
</PartData>

理想情况下,我想让 PartNumber 成为这样的属性:

 <PartData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PartList>
    <PartInfo>
      <PartNumber Id ="12345">
      <OEMNumbers>14556, 14557, 14558, 14559</OEMNumbers>
      <VehicleApplications>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
      </VehicleApplications>
    </Partnumber>
    </PartInfo>
  </PartList>
</PartData>

我已经尝试添加:

public class PartInfo
{
  [XmlAttribute("Id")]
  public string PartNumber { get; set; }

  public string OEMNumbers { get; set; }

  public List<VehicleApplication> VehicleApplications { get; set; }
}

但创建:

<PartInfo Id="12345">

当我需要时:

<PartNumber Id="12345">

【问题讨论】:

  • 您可能是指&lt;PartInfo PartNumber='12345'&gt;(例如,没有PartNumber 作为PartInfo 内容的“包装器”)。如果确实如此,只需将[XmlAttribute] 添加到PartNumber 属性即可。
  • 你目前的序列化情况如何?看起来你可以试试[XmlAttribute],(也请减少你的例子,我花了一段时间才弄清楚有什么不同!)
  • 抱歉粗略的解释......你们两个建议的结果是: 当我想要
  • 我认为您可能需要做的是制作一个具有字符串的零件编号类(即另一个包装器);编辑以节省您在代码中使用部件号时编写额外的行,只需拥有您当前的部件号,获取并设置包装类字符串值
  • 我真的不想做的事......

标签: c# xml xmlserializer


【解决方案1】:

我认为这是实现您想要实现的目标的唯一方法

public class PartDetail
{
  [XmlAttribute]
  public string ID{ get; set; }

  public string OEMNumbers { get; set; }

  public List<VehicleApplication> VehicleApplications { get; set; }
}

public class PartInfo
{
  public PartDetail { get; set; }
}

在回答您的第一条评论时,这是实现它的最简单方法,另一种方法是编写自定义序列化程序

【讨论】:

  • 我最初在我的第一个设计中就有这个,看起来它可能是不覆盖序列化程序类的唯一答案
  • 这是我发现针对我的情况执行此操作的唯一方法,如果您担心必须对代码进行大量更改才能使其正常工作,您可以使用 [XmlIgnore] 标签在 PartInfo 中为部件详细信息中的这些方法提供属性访问器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 2023-04-07
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多