Есть ли способ получить элементы, используя только локальные имена в запросе Linq-to-XML? - PullRequest
9 голосов
/ 06 октября 2008

Предположим, у нас есть этот xml:

<?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, мы можем сделать

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();

но не так

XElement errorList = doc.Root.Elements("RegistryErrorList").SingleOrDefault();

Есть ли способ сделать запрос без пространства имен элемента. В принципе есть что-то концептуально похоже на использование local-name () в XPath (т.е. // * [local-name () = 'RegistryErrorList'])

Ответы [ 3 ]

8 голосов
/ 06 октября 2008
var q = from x in doc.Root.Elements()
        where x.Name.LocalName=="RegistryErrorList"
        select x;

var errorList = q.SingleOrDefault();
2 голосов
/ 07 октября 2008

В синтаксисе "method" запрос будет выглядеть так:

XElement errorList = doc.Root.Elements().Where(o => o.Name.LocalName == "RegistryErrorList").SingleOrDefault();
0 голосов
/ 20 ноября 2015

Следующее расширение вернет коллекцию соответствующих элементов любого уровня XDocument (или любого XContainer).

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

Ваш код теперь будет выглядеть так:

var errorList = doc.GetElements("RegistryErrorList").SingleOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...