Linq to XML не возвращает элементы, если в XML есть элементы - PullRequest
0 голосов
/ 04 февраля 2011

Я пытаюсь запросить некоторые данные XML с помощью Linq, потому что это проще, чем использование XPath, и является хорошим доказательством для моих коллег того, как мы можем использовать Linq. Вот мой XML:

<Booking>
    <ServiceCollection>
        <Service>
            <BookingID>10508507</BookingID>
            <AdditionalChargeID>1</AdditionalChargeID>
            <ServiceName>Fuel Surcharge</ServiceName>
            <ServiceCost>56.87</ServiceCost>
            <ServiceCharge>103.41</ServiceCharge>
            <showInNotes>0</showInNotes>
            <showInHeader>0</showInHeader>
            <BOLHeaderText />
        </Service>
        <Service>
            <BookingID>10508507</BookingID>
            <AdditionalChargeID>2</AdditionalChargeID>
            <ServiceName>Lift Gate at Pickup Point</ServiceName>
            <ServiceCost>25.00</ServiceCost>
            <ServiceCharge>42.00</ServiceCharge>
            <showInNotes>1</showInNotes>
            <showInHeader>1</showInHeader>
            <BOLHeaderText>Lift Gate at Pickup Point</BOLHeaderText>
        </Service>
    </ServiceCollection>
</Booking>

Теперь вот мой код на C # (игнорируйте класс Conversions; они просто проверяют, возвращено ли значение по умолчанию, если элемент равен нулю):

var accessorials = from accessorial in accessorialsXml.Elements("ServiceCollection").Elements("Service")
    select new Accessorial
        {
            BookingID = Conversions.GetInt(accessorial.Element("BookingID").Value),
            Name = accessorial.Element("ServiceName").Value,
            Cost = Conversions.GetDecimal(accessorial.Element("ServiceCost").Value),
            Charge = Conversions.GetDecimal(accessorial.Element("ServiceCharge").Value),
            ShowInNotes = Conversions.GetBool(accessorial.Element("showInNotes").Value),
            ShowInHeader = Conversions.GetBool(accessorial.Element("showInheader").Value),
            BillOfLadingText = accessorial.Element("BOLHeaderText").Value
        };
return accessorials.ToList();

У меня есть модульный тест, который не проходит, потому что число вспомогательных объектов (узел «Сервис» в XML) равно 0, когда оно должно быть 2. Я протестировал этот же код в LinqPad (возвращая анонимный класс вместо фактическая сущность) и возвращает правильное количество значений, но код здесь не возвращает объектов.

Есть идеи?

1 Ответ

1 голос
/ 04 февраля 2011

Ошибка может заключаться в том, как вы получаете accessorialsXml в первую очередь.Попробуйте вывести содержимое этого объекта перед выполнением запроса, чтобы убедиться, что оно точно совпадает со строкой, которую вы используете в LINQPad.

...