Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是表示这个XDocument查询的最有效的方法吗?_C#_Xml_.net 3.5_Linq To Xml - Fatal编程技术网

C# 这是表示这个XDocument查询的最有效的方法吗?

C# 这是表示这个XDocument查询的最有效的方法吗?,c#,xml,.net-3.5,linq-to-xml,C#,Xml,.net 3.5,Linq To Xml,我们使用了第三方web服务,该服务返回类似以下内容的XML(为简洁起见,请删节): 看起来是这样,但是为什么需要所有的ToList()调用呢?我看到了其中的三个调用,我认为不需要它们,所以它们只是降低了代码的速度。但是,我也没有太多地使用Linq to XMl。所提供的领域的定义相当于更简单的: string realm = (string) products.XPathEvaluate( "string( /*/blocks[@name='products']

我们使用了第三方web服务,该服务返回类似以下内容的XML(为简洁起见,请删节):


看起来是这样,但是为什么需要所有的
ToList()
调用呢?我看到了其中的三个调用,我认为不需要它们,所以它们只是降低了代码的速度。但是,我也没有太多地使用Linq to XMl。

所提供的
领域
的定义相当于更简单的

string realm = (string) products.XPathEvaluate(
   "string(
      /*/blocks[@name='products']
                 /*/a[@name='product-id' and . = '1236']
                              /following-sibling::block[1]
          )
   "
                                     )
事实上,这比原始问题中提供的
领域
的定义更具可读性和简洁性


就效率而言,很可能对单个XPath表达式进行求值也会更有效,但是要确定这是否属实,我们需要编写一个应用程序来比较这两种方法的计时。

呃……调试会话中有一些遗留问题。现在已排序。感谢您的回复。我知道我可以用XPath简洁得多,但今天我想在这个问题上伸展我的LINQ腿:-)
List<XElement> products = response
    .Element("Response")
    .Elements("block")
    .Where(x => x.Attribute("name").Value == "products")
    .Elements("block").ToList();
//
// I broke down the query to aid readability
//
string realm = products.Elements("a")
    .Where(x => x.Attribute("name").Value == "product-id")
    .Where(y => y.Value == "1235") // hardcoded for example use
    .Ancestors()
    .First()
    .Elements("block")
    .Where(z => z.Attribute("name").Value == "realms")
    .Elements("block")
    .Elements("a")
    .First().Value;
string realm = (string) products.XPathEvaluate(
   "string(
      /*/blocks[@name='products']
                 /*/a[@name='product-id' and . = '1236']
                              /following-sibling::block[1]
          )
   "
                                     )