Как я могу использовать класс в качестве модели данных при запросе XDocument? - PullRequest
1 голос
/ 12 января 2012

У меня есть XML-документ:

<?xml version="1.0" encoding="utf-8"?>
<Family xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Person member="father" id="0">
    <Surname>Smith</Surname>
    <Forename>Robert</Forename>
      <Person member="son" id="1">
        <Surname>Smith</Surname>
        <Forename>Sam</Forename>
          <Person member="son" id="2">
            <Surname>Smith</Surname>
            <Forename>Jeff</Forename>
          </Person>
      </Person>
      <Person member="daughter" id="3">
        <Surname>Smith</Surname>
        <Forename>Sarah</Forename>
      </Person>
  </Person>
</Family>

... и несколько вспомогательных классов следующим образом:

   [XmlRoot]
   public class Family {

      [XmlElement]
      public List<Person> Person;
   }

   public class Person {

      [XmlAttribute("member")]
      public MemberType Member { get; set; }

      [XmlAttribute("id")]
      public int Id { get; set; }

      [XmlElement]
      public string Surname { get; set; }

      [XmlElement]
      public string Forename { get; set; }

      [XmlElement("Person")]
      public List<Person> People;
   }

   public enum MemberType {
      Father,
      Mother,
      Son,
      Daughter
   }

Теперь, скажем, Family имеет метод, определенный как таковой:

public IEnumerable<Person> Find (Func<Person, bool> predicate) {
    //  also, I know that this SelectMany will not work - assume this foreach works
    //  on a flattened list of people
    foreach (var p in family.Person.SelectMany()) {
        if(predicate(p)) {
            yield return p;
        }
    }
}

... но я не хочу десериализовать XML в классы Family и Person.Я хотел бы просто загрузить XDocument и запросить его напрямую, но работа с XElement, XAttribute и XName не очень удобна при предоставлении API.Я понимаю, что мне нужны классы - Family & Person - но они просто модели.

Могу ли я иметь метод Find, где я могу передать что-то вроде:

IEnumerable<Person> people = someBusinessObj.Find(p => p.Forename == "Jeff");

Обновление
Я бы предпочел решение, не включающее проект с открытым исходным кодом (как ссылается @MartinHonnen).

1 Ответ

1 голос
/ 16 января 2012

Почему вы не хотите десериализовать XML в объекты?Это даст вам именно тот программный интерфейс, который вам необходим.Я хотел бы:

  1. Десериализовать с использованием класса XmlSerializer .
  2. Разрешить пользователям запрашивать через Linq-to-Objects .

Все это требует очень небольших усилий для реализации!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...