2017-05-16 4 views
0

Ich versuche, den Namensraum von Metadaten in diesem XML-Dokument mit XDocument zu erhalten:LINQ to XML GetDefaultNamespace() gibt null

<?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> 

Ich habe versucht, die GetDefaultNamespace() -Methode von XElement zu verwenden, wie so :

XNamespace ns = xmlDoc.Root.GetDefaultNamespace(); 

Allerdings bekomme ich einen Nullwert. Ich habe einige Kommentare gelesen, die besagen, dass der Namespace für Namespaces möglicherweise nicht mit dieser Methode abgerufen werden kann, da der Namespace mehrere Namespaces enthält.

Ich dachte zu versuchen, nur das Attribut von Root.Element ("Metadaten") zu greifen, aber weil ich nicht den Namespace habe, die nicht funktionieren würde, denke ich.

Irgendwelche Ideen?

PS der Grund, dass ich den Namespace nicht unbedingt kenne, ist, weil ich vertrauenswürdige Nuspec-Dateien konsumiere und ich befürchte, dass sich das Schema ändern kann.

+0

Wie erhalten Sie xmlDoc? –

+1

Sie sollten nicht besorgt sein, dass es sich ändern kann; Der Punkt von Namespaces ist ein _stable_-Bezeichner. Es würde sich nur ändern, wenn sich das Format ändert (in diesem Fall würde Ihr Code brechen). – SLaks

+0

XDocument xmlDoc = XDocument.Load (xml); Der Dateizeiger xml ist eine Kopie des obigen XML. – JPAnderson

Antwort

2

xmlDoc.Root ist das <package> Element.
Es hat keinen Standardnamespace.

Sie möchten xmlDoc.Root.Elements().First().GetDefaultNamespace().

+0

Ist dies mit System.Xml.Linq? – JPAnderson