如何在C#(.NET)中反序列化带命名空间前缀的XML元素?
解决C# XmlSerializer反序列化带命名空间的XML元素问题
你的核心问题有两个:
<gml:pos>是XML元素而非属性,不能用[XmlAttribute]特性;- 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
相关产品推荐
相关产品推荐

