C# 如何将内部XML反序列化为对象?
我有一个现有的XML文档,我正试图映射到一个C#类 我还创建了一个单元测试,以确保XML被反序列化 但是,当PageName元素的计数为2时,单元测试失败。调试时,我看到PageName元素计数为0。同样在debug视图中,单个DeskBroker.Broker元素的计数也为0 不确定是否正确设置了XML属性。有人能回顾一下我的作品,看看我是否使用了正确的注释吗?我肯定我错过了什么 多谢各位 这是XML:C# 如何将内部XML反序列化为对象?,c#,xml,unit-testing,C#,Xml,Unit Testing,我有一个现有的XML文档,我正试图映射到一个C#类 我还创建了一个单元测试,以确保XML被反序列化 但是,当PageName元素的计数为2时,单元测试失败。调试时,我看到PageName元素计数为0。同样在debug视图中,单个DeskBroker.Broker元素的计数也为0 不确定是否正确设置了XML属性。有人能回顾一下我的作品,看看我是否使用了正确的注释吗?我肯定我错过了什么 多谢各位 这是XML: <?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<User>
<FavoriteQuotePages>
<Group name="Default">
<PageName>NG Options</PageName>
<PageName startdate="today" enddate="today">NG Options</PageName>
</Group>
<Group name="CUSTOM PAGES">
<PageName sourcepagename="NG Options" daterange="TopDay" startdate="today" enddate="today" customfilters="[{"fieldName":"BidBOEName", "expr":"ION", "cond":"contains"}]">ION ONLY</PageName>
<PageName sourcepagename="NG Options" daterange="TopDay" startdate="today" enddate="today" customfilters="[{"fieldName":"BidBOEName", "expr":"CNG", "cond":"contains"}]">CIE Only</PageName>
</Group>
</FavoriteQuotePages>
<LayoutSettings>
<PageDialog id="1" dialogname="market-page-dialog" modelname="MarketPageModel" viewname="_MarketPage" modelkey="" positionx="238.9965362548828" positiony="76.48611450195312" width="1275" height="650" />
</LayoutSettings>
<QuoteDefaults Product="NATURAL GAS">
<ClearingEntities>
<ID>12</ID>
</ClearingEntities>
<Quantity>100</Quantity>
<ReserveQty></ReserveQty>
<Timer>3</Timer>
<DeskBrokers>
<DeskBroker Desk="2366">
<Broker Primary="False">2368</Broker>
</DeskBroker>
<DeskBroker Desk="2456">
<Broker Primary="False">2657</Broker>
</DeskBroker>
<DeskBroker Desk="2302">
<Broker Primary="False">2306</Broker>
</DeskBroker>
<DeskBroker Desk="2">
<Broker Primary="False">82</Broker>
</DeskBroker>
<DeskBroker Desk="34">
<Broker Primary="False">89</Broker>
</DeskBroker>
<DeskBroker Desk="64">
<Broker Primary="False">15166</Broker>
</DeskBroker>
</DeskBrokers>
</QuoteDefaults>
</User>
NG选项
NG选项
仅离子
仅限CIE
12
100
3.
2368
2657
2306
82
89
15166
我对XML的定义如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace TestApplication
{
#region UserPreferences
[XmlRoot("User")]
public class UserPreferences
{
#region Private Static Members
private static XmlSerializer m_xmlSerializer = new XmlSerializer(typeof(UserPreferences));
#endregion
#region Public Properties
[XmlArray("FavoriteQuotePages")]
public List<PageGroup> FavoriteQuotePages { get; set; }
[XmlArray("LayoutSettings")]
public List<PageDialogSettings> LayoutSettings { get; set; }
public QuoteDefaultSettings QuoteDefaults { get; set; }
#endregion
#region Constructors
public UserPreferences()
{
FavoriteQuotePages = new List<PageGroup>();
LayoutSettings = new List<PageDialogSettings>();
QuoteDefaults = new QuoteDefaultSettings();
}
#endregion
#region XML Serialization Methods
public static string SerializeFrom(UserPreferences userPreferences)
{
try
{
XmlSerializerNamespaces xns = new XmlSerializerNamespaces();
xns.Add(string.Empty, string.Empty);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
StringWriter writer = new StringWriter();
XmlWriter xmlWriter = XmlWriter.Create(writer, settings);
m_xmlSerializer.Serialize(xmlWriter, userPreferences, xns);
String xml = writer.ToString();
return xml;
}
catch (Exception ex)
{
throw ex;
}
}
public static UserPreferences DeserializeFrom(string xml)
{
try
{
StringReader reader = new StringReader(xml);
UserPreferences userPreferences = (UserPreferences)m_xmlSerializer.Deserialize(reader);
return userPreferences;
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
}
#endregion
#region PageGroup
[XmlType("Group")]
public class PageGroup
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlArray("Group")]
public List<Page> Pages { get; set; }
public PageGroup()
{
Pages = new List<Page>();
}
}
#endregion
#region Page
[XmlType("PageName")]
public class Page
{
[XmlElement]
public string Name { get; set; }
[XmlAttribute("startdate")]
public DateTime StartDate { get; set; }
[XmlAttribute("enddate")]
public DateTime EndDate { get; set; }
[XmlAttribute("daterange")]
public string DateRange { get; set; }
[XmlAttribute("customfilters")]
public string CustomFilters { get; set; }
[XmlAttribute("sourcepagename")]
public string SourcePageName { get; set; }
}
#endregion
#region PageDialogSettings
[XmlType("PageDialog")]
public class PageDialogSettings
{
[XmlAttribute("id")]
public int Id { get; set; }
[XmlAttribute("dialogname")]
public string DialogName { get; set; }
[XmlAttribute("viewname")]
public string ViewName { get; set; }
[XmlAttribute("modelname")]
public string ModelName { get; set; }
[XmlAttribute("modelkey")]
public string ModelKey { get; set; }
[XmlAttribute("positionx")]
public double PositionX { get; set; }
[XmlAttribute("positiony")]
public double PositionY { get; set; }
[XmlAttribute("width")]
public int Width { get; set; }
[XmlAttribute("height")]
public int Height { get; set; }
}
#endregion
#region QuoteDefaultSettings
[XmlType("QuoteDefaults")]
public class QuoteDefaultSettings
{
[XmlAttribute("Product")]
public string Product { get; set; }
[XmlElement]
public int Quantity { get; set; }
[XmlElement]
public int ReserveQuantity { get; set; }
[XmlElement]
public int Timer { get; set; }
[XmlArray("ClearingEntities")]
[XmlArrayItem("ID")]
public List<long> ClearingEntityIds { get; set; }
[XmlArray]
public List<DeskBroker> DeskBrokers { get; set; }
public QuoteDefaultSettings()
{
ClearingEntityIds = new List<long>();
DeskBrokers = new List<DeskBroker>();
}
}
#endregion
#region DeskBroker
[XmlType("DeskBroker")]
public class DeskBroker
{
[XmlAttribute("Desk")]
public long DeskId { get; set; }
[XmlArray]
public List<Broker> Brokers { get; set; }
public DeskBroker()
{
Brokers = new List<Broker>();
}
}
#endregion
#region Broker
[XmlType("Broker")]
public class Broker
{
[XmlAttribute]
public bool Primary { get; set; }
public long Id { get; set; }
}
#endregion
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
命名空间测试应用程序
{
#区域用户首选项
[XmlRoot(“用户”)]
公共类用户首选项
{
#区域私有静态成员
私有静态XmlSerializer m_XmlSerializer=新XmlSerializer(typeof(UserPreferences));
#端区
#区域公共财产
[XmlArray(“FavoriteQuotePages”)]
公共列表FavoriteQuotePages{get;set;}
[XmlArray(“布局设置”)]
公共列表布局设置{get;set;}
公共QuoteDefaultSettings QuoteDefaults{get;set;}
#端区
#区域构造函数
公共用户首选项()
{
FavoriteQuotePages=新列表();
LayoutSettings=新列表();
QuoteDefaults=新的QuoteDefaultSettings();
}
#端区
#区域XML序列化方法
公共静态字符串序列化自(UserPreferences UserPreferences)
{
尝试
{
xns=新的XmlSerializerNamespaces();
添加(string.Empty,string.Empty);
XmlWriterSettings=新的XmlWriterSettings();
settings.Indent=true;
settings.OmitXmlDeclaration=true;
StringWriter编写器=新的StringWriter();
XmlWriter=XmlWriter.Create(writer,设置);
m_xmlSerializer.Serialize(xmlWriter,userPreferences,xns);
字符串xml=writer.ToString();
返回xml;
}
捕获(例外情况除外)
{
掷骰子;
}
}
公共静态用户首选项反序列化自(字符串xml)
{
尝试
{
StringReader=新的StringReader(xml);
UserPreferences UserPreferences=(UserPreferences)m_xmlSerializer;
返回用户偏好;
}
捕获(例外情况除外)
{
掷骰子;
}
}
#端区
}
#端区
#区域页面组
[XmlType(“集团”)]
公共类页面组
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[XmlArray(“组”)]
公共列表页{get;set;}
公共页面组()
{
Pages=新列表();
}
}
#端区
#区域页面
[XmlType(“PageName”)]
公共类页面
{
[XmlElement]
公共字符串名称{get;set;}
[XmlAttribute(“起始日期”)]
公共日期时间起始日期{get;set;}
[XmlAttribute(“结束日期”)]
公共日期时间结束日期{get;set;}
[XmlAttribute(“日期范围”)]
公共字符串日期范围{get;set;}
[XmlAttribute(“自定义过滤器”)]
公共字符串CustomFilters{get;set;}
[XmlAttribute(“sourcepagename”)]
公共字符串SourcePageName{get;set;}
}
#端区
#区域页面对话框设置
[XmlType(“PageDialog”)]
公共类页面对话框设置
{
[XmlAttribute(“id”)]
公共int Id{get;set;}
[XmlAttribute(“dialogname”)]
公共字符串对话框名称{get;set;}
[XmlAttribute(“视图名称”)]
公共字符串ViewName{get;set;}
[XmlAttribute(“modelname”)]
公共字符串ModelName{get;set;}
[XmlAttribute(“modelkey”)]
公共字符串ModelKey{get;set;}
[XmlAttribute(“位置X”)]
公共双位置x{get;set;}
[XmlAttribute(“位置”)]
公共双位置{get;set;}
[XmlAttribute(“宽度”)]
公共整数宽度{get;set;}
[XmlAttribute(“高度”)]
公共整数高度{get;set;}
}
#端区
#区域引用错误设置
[XmlType(“QuoteDefaults”)]
公共类QuotedFaultSettings
{
[XmlAttribute(“产品”)]
公共字符串乘积{get;set;}
[XmlElement]
公共整数数量{get;set;}
[XmlElement]
public int ReserveQuantity{get;set;}
[XmlElement]
公共整数计时器{get;set;}
[XmlArray(“clearingenties”)]
[XmlArrayItem(“ID”)]
公共列表ClearingTityId{get;set;}
[XmlArray]
公共列表{get;set;}
公共QuoteDefaultSettings()
{
ClearingEntityIds=新列表();
DeskBrokers=新列表();
}
}
#端区
#区域桌面代理
[XmlType(“DeskBroker”)]
公共类桌面代理
{
[XmlAttribute(“桌面”)]
公共长DeskId{get;set;}
[XmlArray]
公共列表代理{get;set;}
公共桌面代理()
{
代理=新列表();
}
}
#端区
#区域经纪人
[XmlType(“经纪人”)]
公共类经纪人
{
[XmlAttribute]
公共布尔主{get;set;}
公共长Id{get;set;}
}
#端区
}
单元测试:
using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestApplication
{
[TestClass]
public class UserPreferencesTests
{
[TestMethod]
public void DeserializeExistingUserXml()
{
string filename = "user.xml";
if (!File.Exists(filename))
{
throw new FileNotFoundException("Could not find file " + filename);
}
string xmlPreferences = File.ReadAllText(filename);
DateTime startTime = DateTime.Now;
UserPreferences preferences = UserPreferences.DeserializeFrom(xmlPreferences);
TimeSpan duration = DateTime.Now.Subtract(startTime);
Assert.IsTrue(duration.Milliseconds < 100, "The deseralization time took longer than 100ms: " + duration.Milliseconds + "ms");
// Tests
Assert.IsNotNull(preferences);
Assert.AreEqual(2, preferences.FavoriteQuotePages.Count);
var pageGroup = preferences.FavoriteQuotePages[0];
Assert.AreEqual(2, pageGroup.Pages.Count);
Assert.AreEqual("Default", pageGroup.Name);
var page = pageGroup.Pages[0];
Assert.AreEqual("NG Options", page.Name);
page = pageGroup.Pages[1];
Assert.AreEqual("NG Options", page.Name);
pageGroup = preferences.FavoriteQuotePages[1];
Assert.AreEqual(2, pageGroup.Pages.Count);
Assert.AreEqual("CUSTOM PAGES", pageGroup.Name);
Assert.AreEqual(1, preferences.LayoutSettings.Count);
Assert.AreEqual(1, preferences.QuoteDefaults.ClearingEntityIds.Count);
Assert.AreEqual(6, preferences.QuoteDefaults.DeskBrokers.Count);
}
}
}
使用系统;
使用System.IO;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
命名空间测试应用程序
{
[测试类]
公共类UserPreferencesTests
{
[测试方法]
public void反序列化existinguserxml()
{
字符串filename=“user.xml”;
如果(!File.Exists(filename))
{
抛出新的FileNotFoundException(“找不到文件”+文件名);
}
字符串xmlPreferences=File.ReadAllText(文件名);
日期时间开始时间
[XmlArray("Group")]
public List<Page> Pages { get; set; }
[XmlElement("PageName")]
public List<Page> Pages { get; set; }
[XmlType("Group")]
public class PageGroup
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlElement("PageName")]
public List<Page> Pages { get; set; }
public PageGroup()
{
Pages = new List<Page>();
}
}