LinqToXML, почему мой объект выходит из области видимости? Также я должен делать группу? - PullRequest
0 голосов
/ 27 мая 2010

У меня есть IEnumerable . Мне нужно преобразовать его в XML. Существует свойство под названием «ZoneId». Мне нужно написать немного XML на основе этого свойства, а затем мне нужны некоторые дочерние элементы, которые предоставляют данные, относящиеся к ZoneId. Я знаю, что мне нужен какой-то тип группировки. Вот то, что я пытался до сих пор без особого успеха. ** инвентарь - это IEnumerable . Поэтому я запрашиваю инвентарь для уникальных зон. Это работает нормально.

var zones = inventory.Select(c => new {
            ZoneID = c.ZoneId
            , ZoneName = c.ZoneName
            , Direction = c.Direction
        }).Distinct();

Нет, я хочу создать XML на основе зон и места. *** место является собственностью someClass.

        var xml = new XElement("MSG_StationInventoryList"
                               , new XElement("StationInventory"
                                              , zones.Select(station =>
                                                             new XElement("station-id", station.ZoneID)
                                                             , new XElement("station-name", station.ZoneName))));

Это не компилируется, так как "станция" выходит за рамки, когда я пытаюсь добавить элемент "имя станции". Однако, если я удаляю парен после «ZoneId», станция находится в области видимости, и я получаю название станции. Единственная проблема заключается в том, что элемент является потомком «идентификатор станции». Это не желаемый результат. Они должны быть братьями и сестрами. Что я делаю неправильно? Наконец, после элемента «имя станции» мне понадобится еще один сложный тип, который является коллекцией. Назовите его «местами». У него будут дочерние элементы, называемые «местами». Его данные будут поступать из IEnumerable, и мне будут нужны только «места», которые имеют «ZoneId» для текущей зоны. Может кто-нибудь указать мне правильное направление «Является ли ошибкой выделение отдельных зон из исходного IEnumerable? Этот объект содержит все необходимые мне данные. Мне просто нужно сделать его иерархическим. Спасибо за любые указатели на все.

Приветствия
Крис в Сан-Диего

**** Редактировать

var zones = inventory.Select(c => new {
            ZoneID = c.ZoneId
            , ZoneName = c.ZoneName
            , Direction = c.Direction
        }).Distinct();

        var xml = new XElement("MSG_StationInventoryList"
                               , zones.Select(station => new XElement("StationInventory"
                                     , new XElement("station-id", station.ZoneID)
                                     , new XElement("station-name", station.ZoneName)
                                     , new XElement("station-travel-direction", station.Direction)
                                     , new XElement("detector-list"
                                        , inventory.Where(p=>p.ZoneId == station.ZoneID).Select(plaza=> 
                                         new XElement("detector"
                                            , new XElement("detector-id", plaza.PlazaId)))))));

Это сработало.

1 Ответ

3 голосов
/ 27 мая 2010

Попробуйте это:

zones.SelectMany(station => new object[]
{
    new XElement("station-id", station.ZoneID),
    new XElement("station-name", station.ZoneName),
    station.Places.Select(place => new XElement("place", place))
})

Это создает структуру XML, подобную этой:

<MSG_StationInventoryList>
    <StationInventory>
        <station-id>Test1</station-id>
        <station-name>Test Station 1</station-name>
        <place>place1a</place>
        <place>place1b</place>
        <place>place1c</place>
        <station-id>Test2</station-id>
        <station-name>Test Station 2</station-name>
        <place>place2a</place>
        <place>place2b</place>
        <station-id>Test3</station-id>
        <station-name>Test Station 3</station-name>
        <place>place3a</place>
    </StationInventory>
</MSG_StationInventoryList>

Это твое намерение?


Если вы можете изменить структуру XML на что-то другое, я бы посоветовал вам сделать это так:

<MSG_StationInventoryList>
    <StationInventory>
        <station>
            <station-id>Test1</station-id>
            <station-name>Test Station 1</station-name>
            <places>
                <place>place1a</place>
                <place>place1b</place>
                <place>place1c</place>
            </places>
        </station>
        <station>
            <station-id>Test2</station-id>
            <station-name>Test Station 2</station-name>
            <places>
                <place>place2a</place>
                <place>place2b</place>
            </places>
        </station>
        <station>
            <station-id>Test3</station-id>
            <station-name>Test Station 3</station-name>
            <places>
                <place>place3a</place>
            </places>
        </station>
    </StationInventory>
</MSG_StationInventoryList>

Тогда вы можете просто создать XElement для каждой станции и разместить:

zones.Select(station => new XElement("station",
    new XElement("station-id", station.ZoneID),
    new XElement("station-name", station.ZoneName),
    new XElement("places",
        station.Places.Select(place => new XElement("place", place))))
...