0

0

C# XElement Attributes 遍历所有属性

星降

星降

发布时间:2026-02-27 08:17:03

|

513人浏览过

|

来源于php中文网

原创

安全遍历 xelement 所有属性应使用 foreach (var attr in element.attributes()),避免边遍历边增删导致异常;取名用 attr.name.localname,取值后需手动 htmldecode;默认命名空间不作为属性存在,需通过 element.name.namespace 判断。

c# xelement attributes 遍历所有属性

怎么安全遍历 XElement 的所有属性

直接用 element.Attributes() 拿到的是 IEnumerable<xattribute></xattribute>,不是字典也不是键值对集合——它只是按声明顺序返回所有属性节点。如果你要逐个读取、修改或判断存在性,必须遍历这个枚举器,不能靠索引或 key 查找(除非你自己转成字典)。

常见错误是写 element.Attribute("name") == null 来“检查是否有属性”,这只能查单个;真要遍历全部,就得用 foreach.ToList() 后处理。

  • foreach (var attr in element.Attributes()) 最稳妥,不会触发多次枚举
  • 避免 element.Attributes().Count() > 0 做空判断——它会完整遍历一次,后续再遍历就可能报错(如果 XML 是流式加载且不可重读)
  • 属性名区分大小写:attr.Name.LocalName 是实际名称,attr.Name.Namespace 可能非空(比如带 xmlns:xsi

XAttributeNameValue 怎么取才不崩

XAttributeValue 是字符串,但底层存储不自动 trim 或解码。如果原始 XML 里写的是 value=" a & b ",你拿到的就是带空格和 & 实体的原样字符串——XElement 不会帮你 HTML/XML 解码。

另外,attr.NameXName 类型,不是 string。直接 attr.Name.ToString() 虽然能用,但含命名空间时会变成 {http://ns}attr 格式,容易误判。

  • 取纯属性名用 attr.Name.LocalName,更可靠
  • 取值后需要 HTML 实体还原?自己调 WebUtility.HtmlDecode(attr.Value),别指望 XAttribute 自动做
  • 空字符串值和缺失属性是两回事:attr.Value == "" 是合法的,不代表属性不存在

遍历时改属性值会不会影响后续遍历

会,但只在特定条件下。如果你在 foreach 循环里调 attr.SetValue("new"),没问题——这是允许的,XAttribute 支持就地修改;但如果你调 attr.Remove()element.Add(new XAttribute(...)),就可能触发 InvalidOperationException: Collection was modified

FineCam
FineCam

FineShare平台的推出的AI虚拟摄像头,可以将任何摄像头转换为高质量的网络摄像头

下载

根本原因是 element.Attributes() 返回的是一个“实时视图”,底层绑定到元素的属性链表。增删操作会改变链表结构,而 foreach 内部的枚举器没做快照保护。

  • 安全做法:先收集要改的属性(比如用 ToList()),再单独遍历列表去 SetValue
  • 要删属性?用 element.Attributes().Where(...).Remove(),别边遍历边删
  • 新增属性推荐用 element.SetAttributeValue("name", "val"),它内部处理了重复逻辑,比手动 Add 更稳

为什么有时候 Attributes() 看起来“漏”了默认命名空间

因为默认命名空间(xmlns="http://example.com")本身不是属性,它是作用域规则,不参与 XAttribute 枚举。你用 element.Attributes() 永远拿不到它——它属于 XElementName.Namespace,不是某个 XAttributeName

容易混淆的点:如果 XML 里显式写了 xmlns=""xmlns:x="...",这些才是真正的 XAttribute,会被遍历到;但 xmlns="..." 这种默认声明,只影响子元素的默认命名空间解析,不落地为属性节点。

  • 检查默认命名空间是否存在?看 element.Name.Namespace.ToString() 是否为空,而不是查属性
  • 想让遍历结果包含所有命名空间声明?得手动解析 element.Attributes()LocalName == "xmlns" 或前缀为 xmlns: 的项
  • XNamespace 构造查询时,别依赖属性遍历结果反推命名空间——容易漏

真正麻烦的是混合命名空间 + 属性动态生成的场景,比如从不同 Schema 拼装 XML 时,xmlns 声明位置和是否冗余,会影响 Attributes() 的输出顺序和内容,但不会报错——你得自己盯住命名空间作用域边界,光靠遍历属性是看不出问题的。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

248

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

906

2024.03.01

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

200

2023.11.20

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

202

2025.12.04

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1936

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2111

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1138

2024.11.28

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

1

2026.02.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.3万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号