在C#开发中,处理XML数据是家常便饭。但不少开发者一上来就踩坑,要么用XmlDocument这种老古董,要么硬写Elements()链式调用,结果遇到注释、空格或命名空间就挂掉。其实,XDocument搭配Descendants()才是稳妥的起点,它能穿透所有层级,跳过非元素节点,稳定可靠。

c#如何用LINQ查询XML_c#LINQ查询XML从入门到精通教程

简单来说,XDocument + Descendants() 是最稳的起点,别碰 XmlDocument 或硬写 Elements() 链式调用——前者过时,后者一遇到注释、空格、命名空间就失效。

Descendants() 查任意层级节点,不依赖结构深度

XML 常有注释、处理指令、换行文本节点,Elements() 只查直接子节点,一旦 Root 下多了一行空格或一个 doc.Root.Elements("Item") 就返回空。而 Descendants("Item") 会穿透所有层级,跳过非元素节点,结果稳定。

带默认命名空间的 XML 必须声明 XNamespace

A 这种,doc.Descendants("item") 永远为空——字符串匹配对不上命名空间隐式前缀。

Where() + Attribute() / Element() 写条件,别字符串匹配

想查 ?别写 .Where(x => x.ToString().Contains("shipped"))——它会把整个节点序列化成字符串再搜,慢、不准、还可能误中子节点内容。

取值前强制转换 + 判空,别信 Value 永远有值

Element("Title").Value 在节点不存在时抛 NullReferenceExceptionAttribute("Id").Value 同理。LINQ to XML 不自动补默认值。

命名空间和空值处理是实际项目里最常卡住人的两点,其他都好调——但一旦 XML 带了 xmlns,或者某条数据缺了 Author 字段,没做安全转换的代码就会在生产环境突然崩掉。

本文转载于:https://www.php.cn/faq/2343699.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。