You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#(.NET)中反序列化带命名空间前缀的XML元素?

解决C# XmlSerializer反序列化带命名空间的XML元素问题

你的核心问题有两个:

  1. <gml:pos>是XML元素而非属性,不能用[XmlAttribute]特性;
  2. XML中的冒号是命名空间前缀,你需要使用前缀对应的实际命名空间URI,而非前缀本身。

正确的类定义

首先,确认你的XML文件中一定存在gml前缀的命名空间声明(通常在根元素或<Location>元素上),格式类似:

<Location xmlns:gml="http://www.opengis.net/gml">

这是OGC GML的标准命名空间URI,也是绝大多数场景下的取值。如果你的XML用了自定义的gml命名空间,替换成对应的URI即可。

修改你的Location类如下:

public class Location
{
    public decimal Longitude { get; set; }
    public decimal Latitude { get; set; }

    [XmlElement(ElementName = "pos", Namespace = "http://www.opengis.net/gml")]
    public string GmlPos { get; set; }
}

为什么之前的写法无效?

  • 误用特性:你之前用[XmlAttribute],但<gml:pos>是<Location>的子元素,不是属性,必须用[XmlElement];
  • 命名空间错误:命名空间参数需要传入完整的URI,而非gml这种前缀字符串。前缀只是URI的别名,序列化器只认URI。

测试反序列化示例

如果需要验证,可使用以下代码:

var xmlContent = @"<Location xmlns:gml=""http://www.opengis.net/gml"">
    <Longitude>9.118782</Longitude>
    <Latitude>50.178153</Latitude>
    <gml:pos>104049 489104</gml:pos>
</Location>";

var serializer = new XmlSerializer(typeof(Location));
using var stringReader = new StringReader(xmlContent);
var locationObj = (Location)serializer.Deserialize(stringReader);

// 此时locationObj.GmlPos会正确赋值为"104049 489104"

内容的提问来源于stack exchange,提问作者Timbu42

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:13:10