2017-06-26 11 views
-1

私はC#クラスにマップしようとしている既存のXMLドキュメントを持っています。内部XMLをオブジェクトに逆シリアル化する方法

また、XMLが正しく直列化解除されていることを確認するための単体テストも作成しました。

ただし、PageName要素のカウントが2になると予想される場合、単体テストが失敗しています。私がデバッグすると、PageNameの要素数が0であることがわかります。また、デバッグビューでは、個々のDeskBroker.Broker要素のカウントも0になります。

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 
} 

ユニットテスト:次のように私はXMLを定義している

<?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="[{&quot;fieldName&quot;:&quot;BidBOEName&quot;, &quot;expr&quot;:&quot;ION&quot;, &quot;cond&quot;:&quot;contains&quot;}]">ION ONLY</PageName> 
    <PageName sourcepagename="NG Options" daterange="TopDay" startdate="today" enddate="today" customfilters="[{&quot;fieldName&quot;:&quot;BidBOEName&quot;, &quot;expr&quot;:&quot;CNG&quot;, &quot;cond&quot;:&quot;contains&quot;}]">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> 

この

はXMLである

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); 
    } 
    } 
} 
+3

質問を投票した場合、投票の理由を教えてください。ここには透明性がある。 –

+0

この質問を見ると、私のための解決策があるかもしれません:https://stackoverflow.com/questions/364253/how-to-deserialize-xml-document?rq=1 –

答えて

0

を簡単に変更

[XmlArray("Group")] 
public List<Page> Pages { get; set; } 

お楽しみ

[XmlElement("PageName")] 
public List<Page> Pages { get; set; } 

へ;)

注:お使いのXMLはSTARTDATEとして "今日" を使用しています - のDateTimeでは動作しません。その後その

[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>(); 
    } 
} 

代わりのXmlArray( "グループ")、あなたはのXmlElement( "ページ名")を置く必要があります

注意、あなた:

+0

ありがとうサイモン。 XMLElement( "PageName")に変更を加え、startdateおよびenddateフィールドを現在の文字列に変更しました。しかし、XMLのPageName要素とサブ要素はまだ解析されていません。また、PageNameからinnertextを含むフィールドをどのように定義すればよいですか? –

+0

ここで問題となるのは、[XmlElement( "PageName")]はクラスページ自体の宣言[XmlType( "PageName")]と同じではありません - 一方がコレクション、他方が単一要素です - [XmlType( "PageName")]を[XmlType( "PageNameElement")]に設定すると、要素が入力されます。 パブリック文字列を取得するにはName {get;セット; }これは、要素ではなく実際のコンテンツであるため、[XmlElement]を[XmlText]に変更する必要があります。 –

0

あなたは、単にこれにあなたのPagweGroupページを変更する必要がありますXMLはstartDateの "today"文字列にエラーがあります& endDate属性

+0

ありがとうございます。私は変更を行ったので、List ページフィールドにはPageオブジェクトがありますが、ドキュメントの値は含まれていないようです。 –

関連する問題