【问题标题】:Read XML values using XDocument使用 XDocument 读取 XML 值
【发布时间】:2018-03-20 17:14:49
【问题描述】:

下面是我要解析的 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>

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

    在Descendants 中,您必须提供要搜索的节点的XName。在您的代码示例中,您尝试搜索节点属性的值。

    你可以这样做:

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

    这会找到第一个具有Id 属性和值为DLRNUMBER 的ATTR 标记,并返回其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 类型细化搜索。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多