如何序列化为包含属性的 XML?

Posted

技术标签:

【中文标题】如何序列化为包含属性的 XML?【英文标题】:How to Serialize to XML containing attributes? 【发布时间】:2011-01-28 09:23:13 【问题描述】:

我有这个代码:

...
request data = new request(); 
data.username = formNick; 
xml = data.Serialize();
...

[System.Serializable] 
public class request 
 
   public string username; 
   public string password;

   static XmlSerializer serializer = new XmlSerializer(typeof(request));
   public string Serialize() 
    
      StringBuilder builder = new StringBuilder(); 
      XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Encoding = Encoding.UTF8;
      serializer.Serialize(
         System.Xml.XmlWriter.Create(builder, settings ), 
         this); 

      return builder.ToString(); 
    
   public static request Deserialize(string serializedData) 
    
      return serializer.Deserialize(new StringReader(serializedData)) as request; 
    

我想为一些节点添加属性并创建一些子节点。还有如何像这样解析xml:

<answer>
  <player id="2">
    <coordinate axis="x"></coordinate>
    <coordinate axis="y"></coordinate>
    <coordinate axis="z"></coordinate>
    <action name="nothing"></action>
  </player>
  <player id="3">
    <coordinate axis="x"></coordinate>
    <coordinate axis="y"></coordinate>
    <coordinate axis="z"></coordinate>
    <action name="boom">
      <1>1</1>
      <2>2</2>
    </action>
  </player>
</answer>

它不是 XML 文件,它是来自 HTTP 服务器的响应。

【问题讨论】:

msdn.microsoft.com/en-us/library/182eeyhh.aspx。在提出问题之前,请至少进行片刻研究。你会很快找到msdn.microsoft.com/en-us/library/2baksw0z.aspx,比等我告诉你要快。 我做了研究,我是如何得到我的代码的。最有趣的事情 - 很多人使用不同的方法来生成/解析 xml ......这就是我在这里询问它的原因。 【参考方案1】:

最好有一个 XSD 文件来描述您将从服务器接收的 XML。然后,您可以使用 XSD.EXE 程序生成具有适当 .NET 属性的 .NET 类。然后你可以使用XmlSerializer.Deserialize

我将尝试手动为您创建这样的课程。这将是一个快速的尝试,并且可能是错误的(我必须回去工作!)


试试这个,看看它是否有效。

using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;


[XmlRoot("answer")]
public class Answer

    [XmlElement]
    public List<Player> Players  get; set; 


public class Player

    [XmlAttribute("id")]
    public int ID  get; set; 

    [XmlElement]
    public List<Coordinate> Coordinates  get; set; 

    [XmlElement("action")]
    public PlayerAction Action  get; set; 


public class PlayerAction

    [XmlAttribute("name")]
    public string Name  get; set; 

    [XmlAnyElement]
    public XmlElement[] ActionContents  get; set; 


public enum Axis

    [XmlEnum("x")]
    X,
    [XmlEnum("y")]
    Y,
    [XmlEnum("z")]
    Z


public class Coordinate

    [XmlAttribute("axis")]
    public Axis Axis  get; set; 

    [XmlText]
    public double Value  get; set; 

【讨论】:

以上是关于如何序列化为包含属性的 XML?的主要内容,如果未能解决你的问题,请参考以下文章

使用 XmlSerializer 将空 xml 属性值反序列化为可为空的 int 属性

将 xml 数据序列化为 json 时忽略命名空间属性

如何将 xml 元素值反序列化为 C# 类属性

XML - 将属性反序列化为 Xml 子树

将属性序列化为元素中的 Xml 属性

Jackson xml反序列化 - 序列化为一个列表,其中包含任意元素