必须显式声明并使用默认命名空间:用XNamespace存储URI,查找时拼接ns+"Name";属性和值无需命名空间;创建新XML时同样需拼接命名空间。

在 C# 中用 LINQ to XML 处理带默认命名空间(xmlns="...")的 XML 时,必须显式声明并使用该命名空间,否则 XElement.Element()、XElement.Elements() 等方法会返回 null 或空集合——因为默认命名空间会让所有未加前缀的元素实际属于该命名空间,而 LINQ to XML 默认不自动匹配它。
声明并使用默认命名空间
关键:用 XNamespace 存储命名空间 URI,并在查找元素时将其与本地名称拼接(用 + 运算符)。
- 不要直接写
doc.Root.Element("Book")(这会失败) - 要写成
ns + "Book",其中ns是XNamespace实例 - 命名空间声明只写一次,复用即可
从 XML 字符串或文件加载时保留命名空间
LINQ to XML 默认会保留命名空间信息,无需额外设置。只要正确声明 XNamespace,就能精准匹配。
- 示例 XML:
C# Guide - 代码中这样写:XNamespace ns = "http://example.com/ns";
XDocument doc = XDocument.Parse(xml);XElement book = doc.Root.Element(ns + "Book");
查询子元素、属性和文本内容
所有层级的元素访问都要带上命名空间;属性和值不受影响(属性默认不在命名空间中,除非显式加了 xmlns 前缀)。
- 取子元素:
book.Element(ns + "Title")?.Value - 取多个同名元素:
book.Elements(ns + "Author") - 取属性(无命名空间):
book.Attribute("id")?.Value - 注意:
Elements()和Descendants()同样需要ns + "Name"
创建带默认命名空间的新 XML
用 XNamespace 定义后,直接用于构造元素,XML 序列化时会自动添加 xmlns 声明。
XNamespace ns = "http://example.com/ns";-
var root = new XElement(ns + "Root",
new XElement(ns + "Book",
new XElement(ns + "Title", "LINQ to XML"))); - 调用
root.ToString()会输出带xmlns="..."的格式
基本上就这些。核心就一条:默认命名空间不是“无命名空间”,而是有名字的命名空间,只是没前缀。把它当普通命名空间一样对待,问题就解了一大半。










