使用XDocument读取XML值

时间:2018-03-20 17:14:49

标签: c# xml linq-to-xml

以下是我要解析的XML。我需要从第一个FL节点列表中提取DLRNUMBER标记(第一个)。我正在尝试使用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 个答案:

答案 0 :(得分: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类型优化搜索。

答案 1 :(得分:0)

试试以下内容。我更喜欢将所有项目都放在一个数组中,这样我就可以根据需要选择一个或多个项目。 :

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();
        }
    }
}