从XElement中使用位置获取属性名

本文关键字:获取 属性 位置 XElement | 更新日期: 2023-09-27 18:10:16

我在数据定义文件中有以下XML:

<PQTemplate documentID="CSTrlsEN" documentType="TransList" templateID="001" 
            templateType="Customer Copy" 
            templateName="C:'CPS'_templates'Mini-Statements'CSTrlsEN.doc">  
    <field pos="5" name="YPTME" descr="Time"  />
    <field pos="6" name="YPDTE" descr="Action Date"  />
    <field pos="7" name="YPBRNO" descr="Branch Number"  />
    <field pos="8" name="YPBNA" descr="Branch Name"  />
    <field pos="9" name="YPTID" descr="Teller ID"  />
    <field pos="10" name="YPISN" descr="Teller Sequence"  />
    <field pos="11" name="YPREF" descr="Customer Reference"  />
    <field pos="12" name="YPCUS" descr="Customer Name"  />
    <field pos="13" name="YPEAN" descr="Account Number"  />
    <field pos="14" name="YPATY" descr="Account Type"  />
    <field pos="15" name="YPCUR" descr="Currency"  />
    <field pos="16" name="YPBAL" descr="Available Balance"  />
</PQTemplate>

我想通过在字段子元素中添加以name属性命名的列来构建一个数据表,但是我在使用LINQ:

检索信息时遇到了麻烦:

这是我想写的代码,我想添加一个列名使用属性名称其中属性pos是>5,所以第一列将是YPTME,第二列将是YPDTE,以此类推,直到第十二和最后一列添加将是YPBAL

var mapInfo = from nm in XElement.Elements("PQTemplate").Elements("field")
                where (string)nm.Attribute("documentID") == sRequests[0] 
                select nm;
if (mapInfo != null)
{
    for (int iCol = 5; iCol < mapInfo.Count(); iCol++) 
    { 
        // there should be twelve
        string colName = mapInfo.Attributes(iCol);
        dt[0].Columns.Add(new DataColumn(colName, typeof(System.String)));
    }
}

我似乎无法正确地做到这一点,我怎么能做到这一点,我在哪里错了行string colName = mapInfo.Attributes(iCol);

编辑:

我也试过了,但是再次,似乎不能在for..next循环中应用索引:

var mapInfo = from nm in XElement.Elements("PQTemplate").Elements("field")
            where (string)nm.Attribute("documentID") == sRequests[0] && Convert.ToInt32(nm.Attribute("pos").ToString())>=5 
            orderby Convert.ToInt32(nm.Attribute("pos").ToString())
            select nm;
if (mapInfo != null)
{
    for (int iDx=5; iDx<mapInfo.Count(); iDx++)
    {
    string colName=mapInfo[iDx];
    dt[0].Columns.Add(new DataColumn(colName, typeof(System.String)));
            }
    }

谢谢

从XElement中使用位置获取属性名

try this

        XElement rootElement = XElement.Parse(stringXml);
        DataTable dt = new DataTable();
        if (rootElement.Attribute("documentID").Value == "CSTrlsEN")
        {
             var colNames = from field in rootElement.Elements("field")
                          where Convert.ToInt32(field.Attribute("pos").Value) >= 5
                          select field.Attribute("name").Value;
             foreach (var name in colNames)
             {
                 dt.Columns.Add(name, typeof(string));
             }
        }

这应该对你有用:-

 IEnumerable<string> columnNames = from nm in xdoc.Descendants("field")
                          where (string)nm.Parent.Attribute("documentID") == "CSTrlsEN"
                                              && (int)nm.Attribute("pos") >= 5
                          select (string)nm.Attribute("name");

或者,如果你想做documentID的验证,你可以使用一个if块之前的建议@codeninja。

这将为您提供所有具有指定条件的列名,然后您可以简单地循环它:-

 foreach (var colName in columnNames)
 {
     dt[0].Columns.Add(new DataColumn(colName, typeof(System.String)));
 }