2014-03-03 57 views
4

我有這樣的XML文件:在VB.NET使用LINQ與命名空間

<?xml version="1.0"?> 
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> 
    <metadata> 
    <id>NuSpecID</id> 
    <version>1.0.0</version> 
    <title>NuSpec Sample</title> 
    <authors>Jim Bob</authors> 
    <owners>Billy Joel</owners> 
    <licenseUrl>http://url.goes.here</licenseUrl> 
    <projectUrl>http://url.goes.there</projectUrl> 
    <requireLicenseAcceptance>ture</requireLicenseAcceptance> 
    <description>this is a sample nuget.</description> 
    <summary> 
    </metadata> 
</package> 

和驗證碼:

Module Module1 
    Sub Main() 
     Dim root As XElement = XElement.Load("c:\tmp\nuspec.xml") 
     Dim tests As IEnumerable(Of XElement) = _ 
      From el In root.<metadata> _ 
      Select el 
     For Each el As XElement In tests 
      Console.WriteLine(el.<id>.Value) 
     Next 
     Console.ReadKey() 
    End Sub 
End Module 

如果我拿出xmlns="HTTP..."我的代碼輸出 「NuSpecID」,但我找不到解決方案,它允許我使用仍附加的名稱空間來解析/查詢此XML。

我也有一些文件沒有命名空間或有一個不同的,我如何確定是否使用一個和哪一個使用?

回答

5

您需要import the namespace才能在XML文字中使用。

在模塊的頂部,放:

Imports <xmlns:ns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> 

然後在你的函數:

Dim tests = root.<ns:metadata> 

For Each el In tests 
    Console.WriteLine(el.<ns:id>.Value) 
Next 

很明顯,你可以用任何東西來代替ns

+0

或者您可以使用'Imports 設置默認命名空間,因此您不必每次都指定命名空間時間。 – sloth

+0

我調整了我的問題,根據我選擇的文件,我有多個名稱空間選項。我如何編寫一個可以具有不同名稱空間的函數? – theB3RV

+3

@ theB3RV你應該知道你的XML使用的是什麼命名空間,這就是命名空間的全部要點。如果您確實知道每個文件包含的命名空間,請使用不同的前綴將它們全部導入模塊的頂部,然後相應地使用它們。如果您不知道名稱空間,這意味着您不關心它們以及忽略它們,然後以「From el In Root.Elements Where el.Name.LocalName =」metadata「的形式編寫XML查詢。選擇el'。 – GSerg