繁体   English   中英

XML节点中的C#XML元素计数

[英]C# XML Element Count in XML Node

我需要获取特定的<EmpTypeHeader><EID>.EmpList标签的计数<EID>.

例如:

EID - 9991515720640 with 1st EmpTypeHeader(XML Node) tag Contains 2 EmpList Tag
EID - 4534545454534 with 2nd EmpTypeHeader(XML Node) tag Contains 1 EmpList Tag
EID - 8998653323    with 3rd EmpTypeHeader(XML Node) tag Contains 1 EmpList Tag

但是,当我选择EMPList标签计数时,它显示的总数为4。

我的XML:

<Employee>
    <EmployeeHeader>
        <Date>2016-01-07</Date>
        <Time>03:45:39</Time>
    </EmployeeHeader>
    <EmpTypeHeader>
        <EID>9991515720640</EID>
        <AAA>4</AAA>
        <BBB />
        <EmpList>
            <CCC>222</CCC>
            <DDD>3333</DDD>
            <EEE>2050-09-25</EEE>
            <FFF>000</FFF>
        </EmpList>     
        <EmpList>
            <CCC>555</CCC>
            <DDD>666</DDD>
            <EEE>2050-09-25</EEE>
            <FFF>000</FFF>
        </EmpList>   
    </EmpTypeHeader>
    <EmpTypeHeader>
        <EID>4534545454534</EID>
        <AAA>66</AAA>
        <BBB />
        <EmpList>
            <CCC>999</CCC>
            <DDD>008</DDD>
            <EEE>2050-09-25</EEE>
            <FFF>000</FFF>
        </EmpList>      
    </EmpTypeHeader>
    <EmpTypeHeader>
        <EID>8998653323</EID>
        <AAA>9999</AAA>
        <BBB />
        <EmpList>
            <CCC>11333334</CCC>
            <DDD>663312</DDD>
            <EEE>2050-09-25</EEE>
            <FFF>000</FFF>
        </EmpList>      
    </EmpTypeHeader>
</Employee>

而我的代码:

private void ReadXMLEmp()
{
    string eid = "9991515720640";
    string strFileName = @"D:\Raseeth\Test1.xml";
    xmlDocument = new XmlDocument();

    xmlDocument.Load(strFileName);
    xmlNodeListEmpTypeHeader = xmlDocument.SelectNodes("//EmpTypeHeader");                    
    if (xmlNodeListEmpTypeHeader != null)
    {
        int empListCount = 0;

        foreach (XmlNode xmlNodeEmpTypeHeader in xmlNodeListEmpTypeHeader)
        {
            if (xmlNodeEmpTypeHeader["EID"] != null && xmlNodeEmpTypeHeader["EID"].InnerText.Trim() == eid)
            {
                empListCount = xmlNodeEmpTypeHeader.SelectNodes("//Position").Count; 
                Console.WriteLine("EmpList Count : " + empListCount);
                bFlag = true;
                break;
            }
        }
    }
}

如果可以使用.Net 3.5

XElement root = XElement.Load(strFileName);
int total = 0;
foreach(var eid in root.Descendants("EID").ToList())
{
   int count = eid.Parent.Elements("EmpList").Count();
   Console.WriteLine(eid.Value + " " + count.ToString());
   total += count;
}
Console.WriteLine("Total EmpList's: " + total.ToString());

我不是很了解这个问题。 您是否要通过EID获得EmpList的总数或EmpList的总数? 我都做过

问题是您的XPath表达式。 //Position将找到该名称的文档中的所有节点,而您仅对当前节点的后代感兴趣。

将其更改为.//Position . 指当前节点上下文。

话虽如此,LINQ to XML是一种比XPath和旧版XmlDocument API更为简洁的解决方案,例如:

var count = XDocument.Load("path/to/file.xml")
    .Descendants("EmpTypeHeader")
    .Where(x => (string) x.Element("EID") == "9991515720640")
    .Descendants("Position")
    .Count();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM