LINQ XML Читайте различные иерархии в 1 объект - PullRequest
2 голосов
/ 03 февраля 2010

У меня есть XML-файл

<searchResponse requestID=“500” status=“success”>
    <pso>
        <psoID ID=“770e8400-e29b-41d4-a716-446655448549”
        targetID=“mezeoAccount”/>
        <data>
            <email>user2@example.net</email>
            <quotaMeg>100</quotaMeg>
            <quotaUsed>23</quotaUsed>
            <realm>Mezeo</realm>
            <path>/san1/</path>
            <billing>user2</billing>
            <active>true</active>
            <unlocked>true</unlocked>
            <allowPublic>true</allowPublic>
            <bandwidthQuota>1000000000</bandwidthQuota>
            <billingDay>1</billingDay>
        </data>
    </pso>
</searchRequest>

и я хочу извлечь данные в один бизнес-объект. Я лучше пойду

MezeoAccount mcspAccount = new MezeoAccount();
mcspAccount.PsoID = doc.Element("psoID").Attribute("ID").Value;
mcspAccount.Email = doc.Element("email").Value;
...

или создать список, хотя я знаю, что в файле есть только 1 запись?

var psoQuery = from pso in doc.Descendants("data")
    select new MezeoAccount {
        PsoID = pso.Parent.Element("psoID").Attribute("ID").Value,
        Email = pso.Element("email").Value,
        ... };

То, что люди предложили бы, было бы более правильным или даже лучшим способом, если бы я что-то пропустил.

Ответы [ 2 ]

1 голос
/ 03 февраля 2010

Если вы знаете, что ваш xml будет содержать только одну запись данных, вам не следует создавать для нее список. Итак, ваш первый пример выглядит хорошо.

Шаблон, который я лично использую, выглядит примерно так:

public class MezeoAccount 
{
    public string PsoID { get; set; }
    public string Email { get; set; }

    public static MezeoAccount CreateFromXml(XmlDocument xml)
    {
        return new MezeoAccount() 
        {
            PsoID = xml.Element("psoID").Attribute("ID").Value,
            Email = doc.Element("email").Value;
        };
    }
}

//Usage
var mezeoAccount = MezeoAccount.CreateFromXml(xml);
0 голосов
/ 04 февраля 2010

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

using System;
using System.Linq;
using System.Xml.Linq;

public class MezeoAccount
{
    public string PsoId { get; set; }
    public string Email { get; set; }
    public int QuotaMeg { get; set; }
    // Other properties...
}

public class Program
{
    public static void Main()
    {
        XDocument doc = XDocument.Load("input.xml");
        XElement pso = doc.Element("searchResponse").Element("pso");
        XElement data = pso.Element("data");
        MezeoAccount x = new MezeoAccount
        {
            PsoId = pso.Element("psoID").Attribute("ID").Value,
            Email = data.Element("email").Value,
            QuotaMeg = int.Parse(data.Element("quotaMeg").Value),
            // Other properties...
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...