9

假设我们有这个 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();

有没有办法在没有元素名称空间的情况下进行查询。基本上在概念上与在 XPath 中使用 local-name() 类似(即 //*[local-name()='RegistryErrorList'])

4

3 回答 3

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

var errorList = q.SingleOrDefault();
于 2008-10-06T19:54:27.837 回答
2

在“方法”语法中,查询看起来像:

XElement errorList = doc.Root.Elements().Where(o => o.Name.LocalName == "RegistryErrorList").SingleOrDefault();
于 2008-10-07T13:14:10.390 回答
1

以下扩展将从 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();
于 2015-11-20T15:57:12.953 回答