LINQ/XML 在 C# 中 - 使用 XPathEvaluate 返回 XPATH 计数

LINQ/XML in C# - returning an XPATH count with XPathEvaluate

我正在尝试了解如何从其他工具获取任何标准 XPath, 并使其在 C# 中与 Linq 一起工作。我知道还有很多其他方法可以获得答案,但这是针对我正在做的特定研究和学习。
我一直使用 XPath,似乎我应该能够使用 XPath 1.0 从任何其他工具复制它,并在此处 运行(就像我可以使用 XmlDocument 和 SelectSingleNode 方法一样)。实际上,我还没有尝试使用 SelectSingleNode 进行计数,本周末晚些时候会尝试。

首先,我发现我必须在 XDocument 而不是 XElement 上使用 XPathEvaluate,因此我不必删除 XPath 的第一部分。

using System;
using System.Xml.Linq;
using System.Xml.XPath; 

namespace Linq_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            XElement root = new XElement("Root",
                    new XElement("Child", "John"),
                    new XElement("Child", "Jane")
                );
            XDocument xdoc = new XDocument(root);
            /*
            XElement el = root.XPathSelectElement("./Child[1]");
            Console.WriteLine(el);
            */

            string xpathChildCount1 = "count(Root/Child)";
            string strChildCount1 =
                  xdoc.XPathEvaluate("string(" + xpathChildCount1 + ")") as string;
            Console.WriteLine("ChildCount1=" + strChildCount1);

            string strChildCount2 =
                  xdoc.XPathEvaluate(xpathChildCount1) as string;
            Console.WriteLine("ChildCount2=" + strChildCount2);

            /*
            int intChildCount = (int)root.XPathEvaluate("string(" + xpathChildCount + ")");
            Console.WriteLine("Numeric ChildCount=" + intChildCount);
            */


            Console.WriteLine("\n\n Press enter to end ....");
            Console.ReadLine();

        }
    }
}

为了让 Count() 工作,this Whosebug post 给了我用 "string(XPath)" 包装 XPath 的想法。

ChildCount1=2 
ChildCount2=

有没有一种方法可以将计数恢复为整数,而不必将 "string()" 环绕在 XPath 周围?是的,我可以将字符串转换为整数,但为什么需要它?

根据 Microsoft 文档 XPathEvaluate,方法 returns 可以包含布尔值、双精度值、字符串或 IEnumerable 的对象 ,因此您可以使用 double 而不是 string 来获得 Count,例如:

double? nullableCount = root.XPathEvaluate(xpathChildCount1) as double?;
double count = nullableCount.Value;
Console.WriteLine("ChildCount2=" + count);

结果

ChildCount2=2

希望对您有所帮助。

不需要。

c#

void Main()
{
    XElement root = new XElement("Root",
                    new XElement("Child", "John"),
                    new XElement("Child", "Jane")
                );
    XDocument xdoc = new XDocument(root);

    string xpathChildCount1 = "count(Root/Child)";

    string strChildCount1 = xdoc.XPathEvaluate("string(" + xpathChildCount1 + ")") as string;
    Console.WriteLine("ChildCount1=" + strChildCount1);

    string strChildCount2 = xdoc.XPathEvaluate("count(/Root/Child)").ToString();
    Console.WriteLine("ChildCount2=" + strChildCount2);

}