2009-10-08 31 views
0

我想创建可序列化的类,但我想映射二级元素到我的属性的类。这样做的最好方法是什么?c#序列化第二级元素属性

示例XML &类

<SearchResult> 
<Head> 
    <Title q="test">My search Result</Title> 
</Head> 
<Results> 
    <Result>...</Result> 
    <Result>...</Result> 
    <Result>...</Result> 
</Results> 
</SearchResult> 

[Serializable] 
[XmlRoot(ElementName = "GSP")] 
public class SearchResult 
{ 
    **[XmlElement([email protected]"Head\Title")]** 
    public string Title { get; set; } 

    [XmlArray(ElementName = "Results")] 
    [XmlArrayItem(ElementName = "Result")] 
    public List<ResultItem> mySearchResultItems { get; set; } 


} 

[Serializable] 
public class ResultItem 
{ 
... 
} 

所以,在我的例子,我想Title属性的XML

感谢您的帮助映射到<Head><Title>文本值!

回答

4

你不能那样做。您需要创建另一个类的<Head>元素

[XmlRoot(ElementName = "GSP")] 
public class SearchResult 
{ 
    [XmlElement(ElementName = "Head")] 
    public Head Head { get; set; } 

    [XmlArray(ElementName = "Results")] 
    [XmlArrayItem(ElementName = "Result")] 
    public List<ResultItem> mySearchResultItems { get; set; } 


} 

public class Head 
{ 
    [XmlElement(ElementName = "Title")] 
    public string Title { get; set; } 
} 

public class ResultItem 
{ 
... 
} 

而且,如果标题元素必须有一个属性,您还需要创建一个新的类的标题元素...

由方式,[Serializable]属性与XML序列化无关......

+0

喜托马斯,我怕你会说。我将如何做自定义序列化代码,而不是创建更深层次的类(我坦率地不需要)? – Jay 2009-10-09 10:29:39

+0

你可以实现IXmlSerializable接口,它会给你完全控制序列化。但这可能是一项乏味的任务...... – 2009-10-09 12:18:55

-1

您不需要自定义序列化。 Thomas Levesque是正确的,但您可以使用您用于结果的相同设计方法获得您想要的结果。

例子:

[XmlRoot(ElementName = "GSP")] 
    public class SearchResult 
    { 
     //public string Title { get; set; } 
     [XmlArray(ElementName = "Header")] 
     [XmlArrayItem(ElementName = "Title")] 
     public List<String> myHeaderItems { get; set; } 

     [XmlArray(ElementName = "Results")] 
     [XmlArrayItem(ElementName = "Result")] 
     public List<ResultItem> mySearchResultItems { get; set; } 

     public SearchResult() 
     { 
      myHeaderItems = new List<String>(); 
      mySearchResultItems= new List<ResultItem>(); 
     } 

     public SearchResult(string title) : this() 
     { 
      myHeaderItems.Add(title); 
     } 
    } 

    public class ResultItem 
    { 
     [XmlText] 
     public String Flavor; 
    } 


    public void Run() 
    { 
     SearchResult sr = new SearchResult("Search1"); 
     sr.mySearchResultItems.Add(new ResultItem() {Flavor = "one" }) ; 
     sr.mySearchResultItems.Add(new ResultItem() {Flavor = "two" }) ; 

     var s1 = new XmlSerializer(typeof(SearchResult)); 

     Console.WriteLine("Serialized:\n{0}", s1.SerializeToString(sr)); 
    } 

产生这样的输出:

<GSP> 
    <Header> 
    <Title>Search1</Title> 
    </Header> 
    <Results> 
    <Result>one</Result> 
    <Result>two</Result> 
    </Results> 
</GSP> 
相关问题