使用XName与命名空间操作XML时触发异常的技术求助
解决XElement获取命名空间元素时的"字符':'不能用于名称中"异常
这个问题我之前踩过坑,核心是你对XElement处理XML命名空间的方式理解错了——直接把命名空间字符串和元素名拼接的做法是不对的,XName(XML元素的名称类型)的正确格式是{命名空间URI}元素名,而不是用冒号分隔的字符串,这就是你触发异常的原因。
问题根源
你的field元素带有默认命名空间xmlns="http://anUrl",这意味着它下面的value元素也继承了这个命名空间。但你用nameSpace + "value"的方式构造元素名,要么会生成http://anUrlvalue(格式完全错误),要么如果代码里不小心加了冒号(比如nameSpace + ":" + "value"),就会生成http://anUrl:value,这种格式不符合XName的规范,自然会报错。
正确解决方案
我们需要用XNamespace类型来合法构造带命名空间的元素名,有两种常用方式:
方式1:显式定义命名空间
先创建XNamespace对象,再和元素名组合:
// 定义命名空间 XNamespace ns = "http://anUrl"; // 用XNamespace + 元素名得到合法的XName var test = field.Element(ns + "value").Value;
方式2:从元素获取默认命名空间
如果不想硬编码命名空间字符串,可以直接从field元素获取它的默认命名空间,更灵活:
// 获取field元素的默认命名空间 var defaultNs = field.GetDefaultNamespace(); // 同样组合成合法XName var test = field.Element(defaultNs + "value").Value;
补充说明
- 你不需要额外处理CDATA内容,
XElement.Value属性会自动提取CDATA块里的文本内容,所以最终test的值会是aName,完全符合预期。 - 记住:所有带命名空间的XML元素,在LINQ to XML里都必须用
XNamespace来构造XName,直接字符串拼接几乎都会出错。
内容的提问来源于stack exchange,提问作者Daniele Sartori
相关产品推荐
相关产品推荐

