C# XmlReader会自动将名称空间附加到所有元素中,从而使整洁的linq查询变得不可能

C# XmlReader会自动将名称空间附加到所有元素中,从而使整洁的linq查询变得不可能,c#,xml,linq,gmail,C#,Xml,Linq,Gmail,我正在使用XmlReader和XDocument查询gmail提要,我遇到了名称空间自动附加到所有元素的问题 XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = new NetworkCredential(username, password); XmlReaderSettings settings = new XmlReaderSettings();

我正在使用XmlReader和XDocument查询gmail提要,我遇到了名称空间自动附加到所有元素的问题

        XmlUrlResolver resolver = new XmlUrlResolver();
        resolver.Credentials = new NetworkCredential(username, password);

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.XmlResolver = resolver;

        XmlReader reader = XmlReader.Create("https://mail.google.com/mail/feed/atom/", settings);

        XDocument doc = System.Xml.Linq.XDocument.Load(reader);

        var entries = from x in doc.Elements().First().Elements() where x.Name == "entry" select x;
在这种情况下,条目将为空,因为所有元素都自动附加了名称空间。如果我将x.Name更改为x.Name.LocalName或namespace+x.Name,那么它可以工作


我希望防止XmlReader自动附加名称空间,并查询xml最初是如何发送给我的——没有名称空间。

XmlReader不太可能“自动附加名称空间”,因为它通常从不修改xml的内容。我认为所有节点都已经有了名称空间(如果您发布示例XML,它可以得到确认),所以您必须处理它


您可以选择:只使用名称空间或通过将节点移动到您选择的名称空间来转换XML。

注意,如果定义为xmlns=“…”或空,元素将从父元素继承名称空间。要在Linq To Xml中创建完全限定名,可以执行XNamespace ns=“namespace uri here”;var el=doc.Elements().First().Elements(ns+“entry”)我感到困惑,因为XML字符串没有在子元素上显示任何名称空间,但现在我了解到元素从父元素继承名称空间,并且其序列化形式的XML不一定完全映射到反序列化的XML。我现在可以手动为LINQ查询预先设置名称空间。