2016-04-23 1 views
0

Я пытаюсь получить значение одного из элементов-потомков, используя значение другого элемента.Получить элемент корневого потомка, используя значение другого элемента

Вот как XML выглядит:

<RateQuoteResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <RateQuote> 
    <SERVICEUPGRADES> 
     <DELIVERYTIME>Single-hour Window</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed window</SERVICE_TYPE> 
     <TOTAL_COST>245.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYTIME>Multi-hour Window</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed window</SERVICE_TYPE> 
     <TOTAL_COST>245.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDAYS>Please Call Customer Service for Available Days and Times</DELIVERYDAYS> 
     <DELIVERYTIME>Single or Multi Day Window</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed window</SERVICE_TYPE> 
     <TOTAL_COST>130.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>04/26/2016</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <DELIVERYTIME>before 9:00 AM</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed delivery</SERVICE_TYPE> 
     <TOTAL_COST>195.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>04/26/2016</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <DELIVERYTIME>before 12:00 PM (noon)</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed delivery</SERVICE_TYPE> 
     <TOTAL_COST>160.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>04/26/2016</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <DELIVERYTIME>before 3:30 PM</DELIVERYTIME> 
     <SERVICE_TYPE>guaranteed delivery</SERVICE_TYPE> 
     <TOTAL_COST>130.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    <SERVICEUPGRADES> 
     <DELIVERYDATE>04/26/2016</DELIVERYDATE> 
     <DELIVERYDAYS>1</DELIVERYDAYS> 
     <SERVICE_TYPE>regional delivery</SERVICE_TYPE> 
     <TOTAL_COST>95.52</TOTAL_COST> 
    </SERVICEUPGRADES> 
    </RateQuote> 
</RateQuoteResponse> 

То, что я пытаюсь сделать, это получить значение TOTAL_COST узла, в котором элемент является regional delivery

Ниже код работает для всех остальных элементов:

Все эти работы, но нижняя строка возвращают null каждый раз, даже когда узел существует и содержит элементы со значениями.

var deliveryTime7 = doc.Root.Descendants("SERVICEUPGRADES").SingleOrDefault(c => (string)c.Element("SERVICE_TYPE") == "regional delivery"); 

Я делаю что-то неправильно, пытаясь найти этот конкретный элемент? Я попытался добавить пространство имен (что-то вроде ниже), но это тоже не сработало.

var deliveryTime7 = doc.Root.Descendants(ns + "SERVICEUPGRADES").SingleOrDefault(e => (string)e.Element(ns + "SERVICE_TYPE") == "regional delivery"); 
+0

Я пробовал свой код, и он работает для меня. – Arijoon

+0

@ user2574121 Проверено, что ваш код в нем работает: https://dotnetfiddle.net/Wv0vM6. Если вы можете воспроизвести проблему в dotnetfiddle, есть шанс, что мы сможем помочь ... – har07

ответ

0

Добавление пространства имен необязательно, так как ваш контент не находится в пространстве имен (насколько мы можем видеть). Но то, что у вас есть, должно работать.

Единственный совет, который я могу вам дать, это быть осторожным при использовании SingleOrDefault(), он будет метать, если есть несколько результатов, которые в зависимости от того, какой тип запроса вы запрашиваете, могут произойти.

var query = 
    from e in doc.Descendants("SERVICEUPGRADES") 
    where (string)e.Element("SERVICE_TYPE") == "regional delivery" 
    select (decimal)e.Element("TOTAL_COST"); 
+0

Спасибо. Я запомню это. Вышеприведенный запрос не дал никаких результатов. Мне кажется, что условие («SERVICE_TYPE») == «региональная доставка» не работает, не уверен, почему. То же самое работает для других узлов, таких как («DELIVERYTIME») == «Одночасовое окно») – user2574121

0

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

string deliveryTotalCost = "//SERVICEUPGRADES[SERVICE_TYPE='regional delivery']/TOTAL_COST"; 

var cost = doc.XPathSelectElement(deliveryTotalCost); 

Console.WriteLine(cost.Value); 

Что напечатает 95.52

Я лично считаю, что это более удобным для чтения, особенно когда запросы становятся все более сложными. Linq очень эффективен, особенно для операций DAL и List, но для синтаксического анализа XML. Я не большой поклонник.

Удача

+0

Это странно! Я понятия не имею, почему это не работает на моем конце. Только для тестирования я изменил поиск на Element («TOTAL_COST») == «95.52», и теперь он правильно находит элемент. Так что это просто не работает для Element ("SERVICE_TYPE") == "региональная доставка" – user2574121

Смежные вопросы