Чтение значений XML с использованием XDocument

Ниже приведен XML, который я пытаюсь проанализировать. Мне нужно извлечь тег DLRNUMBER из первого списка узлов FL (первый). Я пытаюсь использовать Xdocument. Я не знаю синтаксис, чтобы получить тег.

 XDocument xdoc = XDocument.Load(@"C:\Temp\FR_in.xml");
 var query = from e in xdoc.Descendants("FLSS")
             select e;

Ниже приведен XML:

<PACK Id="NI">
    <PROP Id="KEY1" Val="NI_NY" />
    <PROP Id="SOURCE" Val="NI" />
    <PROP Id="TARGET" Val="NY" />
    <REQUEST Id="CREATE_FR">
        <PROP Id="PROID" Val="LIBRARY.OBJECT" />
        <DOBJ Id="FH">                                                          <ATTR Id="PAYTYPE" Val="WR" />          
            <ATTR Id="DTREATED" Val="3/20/2018" />
            <ATTR Id="DUEDATE" Val="3/20/2018" />
            <ATTR Id="AMOUNT" Val="1499.5" />           
            <ATTR Id="SOURCE" Val="DS" />
            <ATTR Id="CREATOR" Val="DSI" />
            <ATTR Id="APPROVER" Val="UF03567" />
            <COLL Id="FLSS">
                <FL>
                    <DOBJ Id="FL_1">                        
                        <ATTR Id="ACCTNUMBER" Val="162101" />
                        <ATTR Id="CENTER" Val="506" />
                        <ATTR Id="DLRNUMBER" Val="48" />
                        <ATTR Id="DLR" Val="58D" />
                        <ATTR Id="PAYEE" Val="58D" />
                        <ATTR Id="PAYMENTTYPE" Val="WR" />
                        <ATTR Id="AMOUNT" Val="1499.5" />
                    </DOBJ>
                    <DOBJ Id="FL_2">                        
                        <ATTR Id="ACCTNUMBER" Val="194061" />
                        <ATTR Id="CENTER" Val="506" />
                        <ATTR Id="DLRNUMBER" Val="48" />
                        <ATTR Id="DLR" Val="58D" />
                        <ATTR Id="PAYEE" Val="58D" />
                        <ATTR Id="PAYMENTTYPE" Val="WR" />
                        <ATTR Id="AMOUNT" Val="1499.5" />                       
                    </DOBJ>
                </FL>
                </COLL>
        </DOBJ>
    </REQUEST>
</PACK>

2 ответа

Решение

В Descendants Вы должны предоставить XName узлов для поиска. В вашем примере кода вы пытаетесь найти значение атрибута узла.

Вы можете сделать это:

var result = xdoc.Descendants("ATTR")
                 .FirstOrDefault(element => 
                    element.Attribute("Id")?.Value == "DLRNUMBER")?.Attribute("Val")?.Value;

Это находит первый ATTR тег, который имеет Id атрибут со значением DLRNUMBER и возвращает значение его Val приписывать.


Если могут быть другие DLRNUMBER значения на разных уровнях, которые вы не хотите найти, вы можете рассмотреть, чтобы найти COLL первый узел:

var collNode = xdoc.Descendants("COLL").FirstOrDefault();
var result = collNode.Descendants("ATTR")
                 .FirstOrDefault(element => 
                    element.Attribute("Id")?.Value == "DLRNUMBER")?.Attribute("Val")?.Value;

или уточните поиск в соответствии с вашими требованиями и типом XML, который вы ожидаете получить.

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication31
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement fl = doc.Descendants("FL").FirstOrDefault();

            int[] dlrNumbers = fl.Elements("DOBJ").Select(x => x.Elements("ATTR").Where(y => (string)y.Attribute("Id") == "DLRNUMBER").Select(y => (int)y.Attribute("Val"))).SelectMany(y => y).ToArray();
        }
    }
}
Другие вопросы по тегам