2008-10-06 1 views
8

Lets haben wir diese xml annehmen:Gibt es eine Möglichkeit, Elemente unter Verwendung nur lokaler Namen in einer Linq-zu-XML-Abfrage abzurufen?

<?xml version="1.0" encoding="UTF-8"?> 
<tns:RegistryResponse status="urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Failure" 
    xmlns:tns="urn:oasis:names:tc:ebxml-regrep:xsd:rs:3.0" 
    xmlns:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0"> 
    <tns:RegistryErrorList highestSeverity=""> 
     <tns:RegistryError codeContext="XDSInvalidRequest - DcoumentId is not unique." 
      errorCode="XDSInvalidRequest" 
      severity="urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Error"/> 
    </tns:RegistryErrorList> 
</tns:RegistryResponse> 

RegistryErrorList Element abzurufen, wir

XDocument doc = XDocument.Load(<path to xml file>); 
XNamespace ns = "urn:oasis:names:tc:ebxml-regrep:xsd:rs:3.0"; 
XElement errorList = doc.Root.Elements(ns + "RegistryErrorList").SingleOrDefault(); 

tun können, aber nicht dieses

XElement errorList = doc.Root.Elements("RegistryErrorList").SingleOrDefault(); 
mögen Gibt es eine Möglichkeit, die Abfrage zu tun ohne den Namensraum des Elements. Basicly gibt es etwas conceptially similiar local-Namen zu verwenden() in XPath (dh // * [local-name() = 'RegistryErrorList'])

Antwort

8
var q = from x in doc.Root.Elements() 
     where x.Name.LocalName=="RegistryErrorList" 
     select x; 

var errorList = q.SingleOrDefault(); 
2

In der "Methode", um die Abfragesyntax aussehen würde, wie:

XElement errorList = doc.Root.Elements().Where(o => o.Name.LocalName == "RegistryErrorList").SingleOrDefault(); 
0

Die folgende Erweiterung wird eine Sammlung von zusammenpassenden Elementen von jedem Pegel eines XDocument (oder jedem XContainer) zurückzukehren.

 public static IEnumerable<XElement> GetElements(this XContainer doc, string elementName) 
    { 
     return doc.Descendants().Where(p => p.Name.LocalName == elementName); 
    } 

Ihr Code aussehen würde nun wie folgt aus:

var errorList = doc.GetElements("RegistryErrorList").SingleOrDefault(); 
Verwandte Themen