2017-05-16 49 views
0

我这里有一个XML文档:的LINQ to 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。我是否也需要声明项目命名空间?我试过了,我仍然得到对象引用错误。有人能指出我犯的新手错误吗?

+0

你能放在xmlDoc中,变量断点和跟踪它通过看是否XML文件已被装入正确更换?我无法看到文件参数已经初始化的位置,所以很难知道文档本身是否为空 –

+0

试图找出我的调试器出了什么问题,但同时我将xml文档放入字符串文本中并使用XDocument传递它像这样做; 'XDocument xmlDoc = XDocument.Parse(str);'我得到同样的错误。 – JPAnderson

+0

听起来像你的文档是空的 –

回答

1

既然你的根元素也有命名空间,你可以使用命名空间选择根元素,并使用该引用可以引用元数据元素。简单的解决办法将是以下行

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

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

这样做的伎俩。现在我需要弄清楚是否有一种方法可以动态获取名称空间,因为它可以根据nuspec提供的信息进行更改。 – JPAnderson