Как использовать свойства в Linq to XML - PullRequest
0 голосов
/ 13 сентября 2011

Я хочу выбрать элементы XML следующим образом.Пожалуйста, знайте, что Data и Party являются классами.Может кто-нибудь помочь, как добиться следующего:

выбрать новые данные
{
Party.Name = xElem.Element ("Имя"). Значение,
Party.PostBox = xElem.Element ("PostBox"). Значение,
}

При текущем коде я не могу получить доступ к свойствам Party.

static void Main(string[] args)
{
     XDocument doc = XDocument.Load(@"c:\test.xml");
     var q = from xElem in doc.Descendants("Party")
         where (int)xElem.Attribute("ID") == 1
         select new Data
         {

         };
}

public class Data
{
    public Party Party { get; set; }
    public Data()
    {
        this.Party = new Party();
    }
}

public class Party
{
    string name;
    string postbox;

    public string Name
    {
        get { return name; }
        set { this.name = value; }
    }

    public string PostBox
    {
        get { return postbox; }
        set { this.postbox = value; }
    }
}

@Джон Скит: Ниже приведен пример кода.Я получаю сообщение об ошибке «Ссылка на объект не установлена ​​для экземпляра объекта» только во время выполнения.

static void Main(string[] args)
{
    XDocument doc = XDocument.Load(@"c:\test\data.xml");
    var props = from xElem in doc.Descendants("Party")
        where (int)xElem.Attribute("ID") == 1
        select new Data
        {
              Party =
              {
                  Name = xElem.Element("Name").Value.ToString(),
                  PostBox = xElem.Element("PostBox").Value.ToString(),
                  Tax =
                  {
                     CompanyID = xElem.Element("Tax").Element("CompanyID").Value.ToString()
                  }
              }
        }
}


public class Data
{
    public Party Party { get; set; }
    public Data()
    {
        this.Party= new Party();
    }
}

public class Party
{
    string name;
    string postbox;

    public Tax Tax { get; set; }

    public string Name
    {
        get { return name; }
        set { this.name = value; }
    }

    public string PostBox
    {
        get { return postbox; }
        set { this.postbox = value; }
    }
}

public class Tax
{
    string companyid;

    public string CompanyID
    {
        get { return companyid; }
        set { this.companyid = value; }
    }
}

@ Джон Скит: Ниже приведен пример кода.Я получаю сообщение об ошибке «Ссылка на объект не установлена ​​для экземпляра объекта» только во время выполнения.

static void Main(string[] args)
{
    XDocument doc = XDocument.Load(@"c:\test\data.xml");
    var props = from xElem in doc.Descendants("Party")
        where (int)xElem.Attribute("ID") == 1
        select new Data
        {
              Party =
              {
                  Name = xElem.Element("Name").Value.ToString(),
                  PostBox = xElem.Element("PostBox").Value.ToString(),
                  Tax =
                  {
                     CompanyID = xElem.Element("Tax").Element("CompanyID").Value.ToString()
                  }
              }
        }
}


public class Data
{
    public Party Party { get; set; }
    public Data()
    {
        this.Party= new Party();
    }
}

public class Party
{
    string name;
    string postbox;

    public Tax Tax { get; set; }

    public string Name
    {
        get { return name; }
        set { this.name = value; }
    }

    public string PostBox
    {
        get { return postbox; }
        set { this.postbox = value; }
    }
}

public class Tax
{
    string companyid;

    public string CompanyID
    {
        get { return companyid; }
        set { this.companyid = value; }
    }
}

1 Ответ

3 голосов
/ 13 сентября 2011

Вы хотите:

// Modifies the existing Party created in the Data constructor
select new Data 
{ 
    Party =
    {
        Name = xElem.Element("Name").Value, 
        PostBox = xElem.Element("PostBox").Value
    }
}

или

// Creates a new Party and then calls the Data.Party setter
select new Data 
{ 
    Party = new Party
    {
        Name = xElem.Element("Name").Value, 
        PostBox = xElem.Element("PostBox").Value
    }
}

Обратите внимание, что это не имеет ничего общего с XML и не имеет ничего общего с LINQ - это просто использование функций инициализатора объектов.

Одна вещь, которую вы можете рассмотреть, - это использование явного преобразования из XElement в string вместо Value - таким образом, если элемент отсутствует, вы получаете пустую ссылку вместо исключения. Это зависит от того, какое поведение вы хотите, но в качестве опции стоит знать об этом.

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