Как получить значение дочернего node из XDocument
Мне нужно получить значение child node из XDocument, используя linq
<root>
<Cust>
<ACTNumber>1234</ACTNumber>
<Address>
<Street></Street>
<City>123 Main street</City>
<State>AL</State>
</Address>
</Cust>
</root>
Я пробовал это: xDocTest.Root.Elements("Cust").Elements("ACTNumber")
Если я попробую адрес вместо ACTNumber, он будет работать. Но это не дает значение node для ребенка.
Ответы
Ответ 1
Если есть только один элемент Cust
и только один элемент ACTNumber
, то это легко:
string actNumber = doc.Root.Element("Cust").Element("ACTNumber").Value;
Или получить его как long
:
long actNumber = (long) doc.Root.Element("Cust").Element("ACTNumber");
Ответ 2
Используйте это:
xDocTest.Root.Element("Cust").Element("Adress").Element("City").Value
Если вы используете Elements (обратите внимание на множественное число), он дает u IEnumerable, это будет использоваться следующим образом:
XML
<Father>
<Child>Hello</Child>
<Child>World!</Child>
</Father>
С#
foreach(var childElement in Root.Elements("Child")) Console.WriteLine(childElement.Value);
Или взять пример:
foreach(var child in xdoc.Root.Element("Cust").Element("Address").Elements())
Console.WriteLine(string.Format("{0} : {1}", child.Name, child.Value);
Я не уверен, как ведет себя Элемент, если у вас несколько элементов с тем же именем. Таким образом, вы можете использовать Elements и Inerate во всех случаях.
И в Linq
Если есть более одного клиента...
var result = from cust in xdoc.Root.Elements("Cust")
where cust.Elements("ACTNumber").Any() // This is to make sure there
// is an element called ACTNumber
// otherwise .Value would create
// Nullrefexception.
select child.Element("ACTNumber").Value;