XML XML 节点中的 C# XML 元素计数
C# XML Element Count in XML Node
我需要获取 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
但是当我 select 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();
我需要获取 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
但是当我 select 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();