使用 XDocument 读取 XML 个值
Read XML values using XDocument
下面是我正在尝试解析的 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>
在 Descendants
中,您必须提供要搜索的节点的 XName
。在您的代码示例中,您尝试搜索节点属性的值。
你可以这样做:
var result = xdoc.Descendants("ATTR")
.FirstOrDefault(element =>
element.Attribute("Id")?.Value == "DLRNUMBER")?.Attribute("Val")?.Value;
这会找到第一个 ATTR
标签,该标签的 Id
属性的值为 DLRNUMBER
并且 returns 其 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 类型优化搜索。
试试看。我更喜欢将所有项目都放在一个数组中,这样我就可以根据需要 select 一个或多个项目。 :
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();
}
}
}
下面是我正在尝试解析的 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>
在 Descendants
中,您必须提供要搜索的节点的 XName
。在您的代码示例中,您尝试搜索节点属性的值。
你可以这样做:
var result = xdoc.Descendants("ATTR")
.FirstOrDefault(element =>
element.Attribute("Id")?.Value == "DLRNUMBER")?.Attribute("Val")?.Value;
这会找到第一个 ATTR
标签,该标签的 Id
属性的值为 DLRNUMBER
并且 returns 其 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 类型优化搜索。
试试看。我更喜欢将所有项目都放在一个数组中,这样我就可以根据需要 select 一个或多个项目。 :
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();
}
}
}