LINQ to XML如何使用多个命名空间获取子元素值

时间:2017-05-16 16:00:11

标签: c# xml linq

我这里有一个xml文档:

<?xml version="1.0" encoding="utf=8"?>
<package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <id>NugetName</id>
    <version>1.0.0</version>
    <authors>company</authors>
    <owners>company</owners>
  </metadata>
  <files>
  ...
  </files>
</package>

我正试图获得“id”的值。我目前正在使用XDocument,我尝试了几种不同的方法来解决这个问题。

我确信我可以使用以下内容:

XDocument xmlDoc = XDocument.Load(file);
XNamespace xns = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd";
XElement el = xmlDoc.Element(xns + "metadata");
XElement id = el.Element(xns + "id");
string idValue = id.Value;
Console.WriteLine(idValue);

但是,我得到错误:对象引用未设置为对象的实例。 我不确定Element如何为null。我是否还需要声明项目命名空间?我试过了,我仍然得到对象引用错误。有人能指出我所犯的新手错误吗?

1 个答案:

答案 0 :(得分:1)

由于您的根元素也具有命名空间,因此您可以使用命名空间选择根元素,并使用该引用可以引用元数据元素。最简单的修复方法是替换以下行

XElement el = xmlDoc.Element(xns + "metadata");

XElement el = xmlDoc.Root.Element(xns + "metadata");