0

我正在尝试基于此 XML 定义 C# 对象:

<UPDs LUPD="86">
  <UPD ID="106">
    <ER R="CREn">
      <NU UID="1928456" />
      <NU UID="1886294" />
      <M>
        <uN>bob · </uN>
        <mO>fine :D</mO>
      </M>

到目前为止,我有:

public class UDPCollection    
{
    List<UDP> UDPs; 

    public UDPCollection()
    {
        UDPs = new List<UDP>();
    }
}

public class UDP
{
    public int Id;
    public List<ER> ERs;
    public UDP(int id, List<ER> ers)
    {
        Id = id;
        ERs = ers;
    }
}

public class ER
{
    public string LanguageR;

    public ER(string languager)
    {
        LanguageR = languager;
    }
}

我的问题:元素在 C# 中映射到什么?上课?属性映射到什么?特性?我会以正确的方式解决这个问题吗?

4

2 回答 2

1

使用XmlSerializer类和XmlRootXmlElementXmlAttribute属性。例如:

using System.Xml.Serialization;

...

[XmlRoot("UPDs")]
public class UDPCollection
{
    // XmlSerializer cannot serialize List. Changed to array.
    [XmlElement("UPD")]
    public UDP[] UDPs { get; set; }

    [XmlAttribute("LUPD")]
    public int LUPD { get; set; } 

    public UDPCollection()
    {
        // Do nothing
    }
}

[XmlRoot("UPD")]
public class UDP
{
    [XmlAttribute("ID")]
    public int Id { get; set; }

    [XmlElement("ER")]

    public ER[] ERs { get; set; }

    // Need a parameterless or default constructor.
    // for serialization. Other constructors are
    // unaffected.
    public UDP()
    {
    }

    // Rest of class
}

[XmlRoot("ER")]
public class ER
{
    [XmlAttribute("R")]
    public string LanguageR { get; set; }

    // Need a parameterless or default constructor.
    // for serialization. Other constructors are
    // unaffected.
    public ER()
    {
    }

    // Rest of class
}

写出 XML 的代码是:

using System.Xml.Serialization;

...

// Output the XML to this stream
Stream stream;

// Create a test object
UDPCollection udpCollection = new UDPCollection();
udpCollection.LUPD = 86;
udpCollection.UDPs = new []
{
    new UDP() { Id= 106, ERs = new [] { new ER() { LanguageR = "CREn" }}}
};

// Serialize the object
XmlSerializer xmlSerializer = new XmlSerializer(typeof(UDPCollection));
xmlSerializer.Serialize(stream, udpCollection);

并不是说 XmlSerializer 添加了额外的命名空间,但如果需要,它可以在没有它们的情况下解析 XML。上面的输出是:

<?xml version="1.0"?>
<UPDs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" LUPD="86">
    <UPD ID="106">
       <ER R="CREn" />
    </UPD>
</UPDs>

使用Deserialize()方法将其从 XML 解析为对象。

于 2012-09-10T01:54:06.603 回答
0

XML 元素和属性不一定映射到 C# 中的任何内容。如果需要,您可以将它们映射到类和属性,但这不是必需的。

也就是说,如果您想将现有 XML 映射到某种 C# 数据结构,那么您这样做的方式似乎是合理的 - 我只是建议用实际属性替换您的公共字段,并且可能使列表属性更少特定类型 - 比如说,IEnumerable、ICollection 或 IList,如果它们确实需要按顺序排列的话。

于 2012-09-09T23:55:52.607 回答