【问题标题】:C# XML Element Count in XML NodeXML 节点中的 C# XML 元素计数
【发布时间】:2016-04-27 09:13:34
【问题描述】:

我需要得到EmpList标签的计数,特别是<EmpTypeHeader><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;
            }
        }
    }
}

【问题讨论】:

  • 没关系,看来我是瞎了眼。 (删除了之前的评论)

标签: c# xml xmldocument xmlnode xmlnodelist


【解决方案1】:

问题在于您的 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();

【讨论】:

    【解决方案2】:

    如果你可以使用 .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 的计数?我都做了。

    【讨论】:

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