Linq XML复杂选择(3级)

时间:2013-04-19 02:17:24

标签: c# xml linq

我需要从ConnectionString的{​​{1}}配置部分获取准确的参数MAINDB

ServerConfig

我已经尝试过使用Linq的几种方法但没有成功。

我的最后一次尝试:

<?xml version="1.0" encoding="utf-8" ?>
<ServerConfig>
  <config section="MAINDB">
    <parameter type="ConnectionString">"CONNSTRING"</parameter>
    <parameter type="ConnectionString1">"CONNSTRING1"</parameter>
    <parameter type="ConnectionString2">"CONNSTRING2"</parameter>
    <parameter type="ConnectionString3">"CONNSTRING3"</parameter>
  </config>
  <config section="OTHERDB">
    <parameter type="ConnectionString">"CONNSTRING"</parameter>
    <parameter type="ConnectionString1">"CONNSTRING1"</parameter>
    <parameter type="ConnectionString2">"CONNSTRING2"</parameter>
    <parameter type="ConnectionString3">"CONNSTRING3"</parameter>
  </config>
  <config section="OTHERPARAM">
    <parameter type="OtherString">"OTHERSTRING"</parameter>
  </config>
</ServerConfig>

从所有部分中选择所有参数。

如何撰写此查询?

2 个答案:

答案 0 :(得分:1)

这种情况在这里使用xpath更加清晰。 LINQ to XML查询可能会有点冗长。

const string configSection = "MAINDB";
const string parameterType = "ConnectionString";

// using xpath //
var xpath = String.Format(
    "/ServerConfig/config[@section='{0}']/parameter[@type='{1}']",
    configSection, parameterType
);
var query1 = (string)doc.XPathSelectElement(xpath);

// using LINQ //
var query2 =
    (from config in doc.Elements("ServerConfig").Elements("config")
    where (string)config.Attribute("section") == configSection
    from parameter in config.Elements("parameter")
    where (string)parameter.Attribute("type") == parameterType
    select (string)parameter).FirstOrDefault();

答案 1 :(得分:0)

var connectionString = (from c in xdoc.Root.Elements("config")
                        where (string) c.Attribute("section") == "MAINDB"
                        from p in c.Elements("parameter")
                        where (string) p.Attribute("type") == "ConnectionString"
                        select (string) p).FirstOrDefault();

connectionString将包含您的值,如果找不到则会null