C# 使用C对不同的节点值进行计数

C# 使用C对不同的节点值进行计数,c#,xml,C#,Xml,我有包含节点的xml。我想计算特定节点的不同值,并将其存储到C中的一个变量中 我的XML是这样的 <?xml version="1.0" encoding="utf-8"?> <Emp> <A.EMPLID>1</A.EMPLID> <A.Phone>1234</A.Phone> </Emp> <Emp> <A.EMPLID>2</A.EMPLID

我有包含节点的xml。我想计算特定节点的不同值,并将其存储到C中的一个变量中

我的XML是这样的

<?xml version="1.0" encoding="utf-8"?>
<Emp>
      <A.EMPLID>1</A.EMPLID>
      <A.Phone>1234</A.Phone>
</Emp>
<Emp>
      <A.EMPLID>2</A.EMPLID>
      <A.Phone>1234</A.Phone>
</Emp>
<Emp>
      <A.EMPLID>1</A.EMPLID>
      <A.Phone>1234</A.Phone>
</Emp>
<Emp>
      <A.EMPLID>3</A.EMPLID>
</Emp>

不确定如何计算不同的Emplid。在这种情况下,它将是“3”

,正如@Richardissimo所指出的,每个XML必须有并且只有一个根元素

string str = @"
<root>
    <Emp>
            <A.EMPLID>1</A.EMPLID>
            <A.Phone>1234</A.Phone>
    </Emp>
    <Emp>
            <A.EMPLID>2</A.EMPLID>
            <A.Phone>1234</A.Phone>
    </Emp>
    <Emp>
            <A.EMPLID>1</A.EMPLID>
            <A.Phone>1234</A.Phone>
    </Emp>
    <Emp>
            <A.EMPLID>3</A.EMPLID>
    </Emp>
</root>";

var xml = XElement.Parse(str);
int count = xml.Elements().GroupBy(x => x.Element("A.EMPLID").Value).Count();
// count = 3

你的评论就快到了。 假设您在xml值周围添加了一个名为root的节点

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("SAMPLE.xml");
XmlNodeList count = xmlDoc.SelectNodes(@"//root/Emp/A.EMPLID");
int i = count.Cast<XmlNode>().Select(a => a.InnerText).Distinct().Count();

会出现什么错误?Xml文档需要一个根节点。除了第一行之外,您需要一个包装文件内容的节点;但是出现了一个错误,无法转换variable@user2897967除了检查无效的XML之外,还需要使用类似于xmlDoc.SelectNodes/Root/Emp的东西来获取它们;谢谢你的回复!我的Xml可能很长。那么我如何将xmlDoc移动到String。XML文件的大小是多少?LINQtoXML只适用于内存中的XML,这就是为什么加载大尺寸XML不是一个好主意。字符串变量仅用于说明。要加载外部文件,请使用XElement.LoadfileName.I将root添加到文件中并使用上述代码。如果我可以温和地批评一下的话:这有点像用比利时法语回答用瑞士法语提出的问题。该问题使用XmlDocument,而此答案使用XDocument,这是两种完全不同且不兼容的语法,用于处理点网络中的XML文件。@Richardissimo那么这是一个糟糕的批评:@user2897967您的评论中的强制转换不正确,因为XmlNodeList的内容是XmlNodes,XML文件中没有任何东西表示XmlAttribute。
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("SAMPLE.xml");
XmlNodeList count = xmlDoc.SelectNodes(@"//root/Emp/A.EMPLID");
int i = count.Cast<XmlNode>().Select(a => a.InnerText).Distinct().Count();