C# XElement.CreateNavigator与XDocument.CreateNavigator
给定此XML文件:C# XElement.CreateNavigator与XDocument.CreateNavigator,c#,xml,C#,Xml,给定此XML文件: <?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <mySection> <NetworkShare folder="
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<mySection>
<NetworkShare folder="\\myFolder\v1" />
</mySection>
</configuration>
但此代码有效(正确打印出文件夹):
这是.net中的错误吗?问题在于
XDocument
上的查询与XElement
上的查询处于不同的上下文中。对于XDocument
,它表示整个文档。它的子元素是根元素(configuration
)。对于XElement
,它表示元素本身
因此,当您通过XElement.Load()
加载文件时,查询将与该元素相关。通过XDocument.Load()
加载文件时,查询将与文档相关
因此,当您查询
/configuration/…
时,由于对于XElement
您当前位于配置
元素,它显然没有配置
子元素,因此查询不会产生任何结果。另一方面,对于XDocument
,它可以正常工作。谢谢。使用XElement,正确的解析方法是使用var q=navigator.Select(“/mySection/NetworkShare”);
var navigator = XElement.Load(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath).CreateNavigator();
var q = navigator.Select("/configuration/mySection/NetworkShare");
if (q.Count == 1) // q.Count is 0
{
q.MoveNext();
Console.WriteLine(q.Current.GetAttribute("folder", navigator.Prefix));
}
var navigator = XDocument.Load(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath).CreateNavigator();
var q = navigator.Select("/configuration/mySection/NetworkShare");
if (q.Count == 1) // q.Count is 1
{
q.MoveNext();
Console.WriteLine(q.Current.GetAttribute("folder", navigator.Prefix));
}