Как получить значение дочернего 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;