为什么 XDocument 不读取元素值?
Why XDocument isn't reading elements value?
我有读取 proj
个文件并检查其 assembly
名称的代码。
XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003";
XDocument projDefinition = XDocument.Load(projPath);
assemblyName = projDefinition
.Element(msbuild + "Project")
.Element(msbuild + "PropertyGroup")
.Element(msbuild + "AssemblyName")
.Value;
以上代码在 99% 的情况下都能完美运行。今天,当它试图从下面的代码中获取 assembly
名称时,它得到了 Null Object Reference Exception
。顶部 property group element
和 import element
通常朝向 proj
文件的底部。
我的问题是为什么 XDocument
没有超过 Import Element
而没有接其他 propertygroup elements
?
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<UseGlobalApplicationHostFile />
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
Some Elements ...
<AssemblyName>AssemblyNameGoesHere</AssemblyName>
根据您提供的 XML 片段,我认为问题的根源在于您的 XML 查询正在查找 <PropertyGroup>
个不包含子 <AssemblyName>
元素,因此您的 NULL reference exception
。您可能需要的是收集所有 <PropertyGroup>
元素的代码,遍历它们以查找 <AssemblyName>
元素和 return 您为它找到的第一个值。
XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003";
XDocument projDefinition = XDocument.Load(@"C:\Path\To\Project.csproj");
var propertyGroups = projDefinition.Element(msbuild + "Project")
.Elements(msbuild + "PropertyGroup");
string assemblyNameValue = "";
foreach (XElement propertyGroup in propertyGroups)
{
//Check if this <PropertyGroup> elements contains a <AssemblyName> element
if (propertyGroup.Element(msbuild + "AssemblyName") != null)
{
assemblyNameValue = propertyGroup.Element(msbuild + "AssemblyName").Value;
break;
}
}
Console.WriteLine("AssemblyName: " + assemblyNameValue);
我有读取 proj
个文件并检查其 assembly
名称的代码。
XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003";
XDocument projDefinition = XDocument.Load(projPath);
assemblyName = projDefinition
.Element(msbuild + "Project")
.Element(msbuild + "PropertyGroup")
.Element(msbuild + "AssemblyName")
.Value;
以上代码在 99% 的情况下都能完美运行。今天,当它试图从下面的代码中获取 assembly
名称时,它得到了 Null Object Reference Exception
。顶部 property group element
和 import element
通常朝向 proj
文件的底部。
我的问题是为什么 XDocument
没有超过 Import Element
而没有接其他 propertygroup elements
?
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<UseGlobalApplicationHostFile />
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
Some Elements ...
<AssemblyName>AssemblyNameGoesHere</AssemblyName>
根据您提供的 XML 片段,我认为问题的根源在于您的 XML 查询正在查找 <PropertyGroup>
个不包含子 <AssemblyName>
元素,因此您的 NULL reference exception
。您可能需要的是收集所有 <PropertyGroup>
元素的代码,遍历它们以查找 <AssemblyName>
元素和 return 您为它找到的第一个值。
XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003";
XDocument projDefinition = XDocument.Load(@"C:\Path\To\Project.csproj");
var propertyGroups = projDefinition.Element(msbuild + "Project")
.Elements(msbuild + "PropertyGroup");
string assemblyNameValue = "";
foreach (XElement propertyGroup in propertyGroups)
{
//Check if this <PropertyGroup> elements contains a <AssemblyName> element
if (propertyGroup.Element(msbuild + "AssemblyName") != null)
{
assemblyNameValue = propertyGroup.Element(msbuild + "AssemblyName").Value;
break;
}
}
Console.WriteLine("AssemblyName: " + assemblyNameValue);