2013-03-11 5 views
1
<Root> 
    <Sub> 
     <Name>a</Name> 
     <Value>1</Value> 
    </Sub> 
    <Sub> 
     <Name>b</Name> 
     <Value>2</Value> 
    </Sub> 
</Root> 

Как выбрать значение Value элемента в зависимости от Name элемента?Выбор элемента XML на основе другого значения элементов

Редактировать: В XDocument, как мне получить значение «1», когда у меня есть «a».

+1

Что * точно * вы имеете в виду? –

+0

Зависимый, как? – BoltClock

ответ

2

Я предлагаю вам использовать литейные узлы вместо доступа Value свойство непосредственно:

int value = xdoc.Descendants("Sub") 
       .Where(s => (string)s.Element("Name") == "a") 
       .Select(s => (int)s.Element("Value")) 
       .FirstOrDefault(); 

Если значение по умолчанию (ноль) для недостающих узлов не соответствует вашим потребностям, тогда вы можете проверить необходимый элемент Sub до получения значения:

var sub = xdoc.Descendants("Sub") 
       .FirstOrDefault(s => (string)s.Element("Name") == "a"); 

if (sub != null)    
    value = (int)sub.Element("Value"); 

Или просто одна линия с XPath и Linq:

int value = (int)xdoc.XPathSelectElement("//Sub[Name='a']/Value"); 
+0

@JLRishe спасибо, забыли про FirstOrDefault в первом примере –

+1

Отмечено как ответ, так как я полностью забыл о XPath и должен был просто использовать это. – Shawn

+0

Линия XPath действительно помогла, спасибо – blueprintChris

1

Ну, думаю об этом ...

вы можете легко прочитать XML-файл, только вы должны проверить состояние, если внутренний текст <Name> спичка с вашим состоянием, чем вы должны прочитать значение <value> тег.

Здесь вы можете найти ответ для how to read XML file from c# code.

1

вы можете попробовать это, может помочь

var results = from row in xdoc.Root.Descendants("Sub") 
where row.Element("Name").value ="value" 
select new XElement("row", row.Element("Value")); 
1

Это следует сделать это:

(при условии doc является экземпляром XDocument)

string name = "a"; 
var items = doc.Descendants("Sub") 
       .Where(s => (string)s.Element("Name") == name) 
       .Select(s => s.Element("Value").Value); 

items приведет как IEnumerable<string> в этом случае.

Если вы знаете, вы хотите только одно значение:

string name = "a"; 
string value = doc.Descendants("Sub") 
       .Where(s => (string)s.Element("Name") == name) 
       .Select(s => s.Element("Value").Value) 
       .FirstOrDefault();