c # сериализует элемент второго уровня в свойство - PullRequest
0 голосов
/ 08 октября 2009

Я пытаюсь создать сериализуемый класс, но я хочу сопоставить элемент второго уровня со своим свойством класса. Какой лучший способ сделать это.

Пример xml & class

<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(ElementName=@"Head\Title")]**
    public string Title { get; set; }

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


}

[Serializable]
public class ResultItem
{
...
}

Итак, в моем примере я хотел бы сопоставить свойство Title с <Head><Title> текстовым значением в xml

Спасибо за вашу помощь !!

Ответы [ 2 ]

4 голосов
/ 08 октября 2009

Вы не можете этого сделать. Вам нужно создать еще один класс для элемента <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
{
...
}

Кроме того, если элемент Title должен иметь атрибут, вам также потребуется создать новый класс для элемента Title ...

Кстати, атрибут [Serializable] не имеет ничего общего с сериализацией XML ...

0 голосов
/ 13 октября 2009

Вам не нужно настраивать сериализацию. Томас Левеск прав, но вы можете получить то, что хотите, используя тот же подход к проектированию, который вы использовали для Результатов.

Пример:

    [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>
...