gpt4 book ai didi

c# - 如何使用 XmlSerializer 来处理不同的命名空间版本?

转载 作者:数据小太阳 更新时间:2023-10-29 02:49:10 26 4
gpt4 key购买 nike

我正在使用 .NET XmlSerializer 类反序列化 GPX 文件。

GPX 标准有两个版本:

  • ...
  • ...

另外,一些 GPX 文件没有指定默认命名空间:

  • ...

我的代码需要处理所有这三种情况,但我不知道如何让 XmlSerializer 来处理它。

我确信一定有一个简单的解决方案,因为这是一个常见的场景,例如 KML 也有同样的问题。

最佳答案

我以前做过几次类似的事情,如果你只需要处理少量的命名空间并且你事先知道它们,这可能对你有用。创建一个简单的类继承层次结构,并为不同的命名空间为不同的类添加属性。请参阅以下代码示例。如果你运行这个程序,它会给出输出:

Deserialized, type=XmlSerializerExample.GpxV1, data=1
Deserialized, type=XmlSerializerExample.GpxV2, data=2
Deserialized, type=XmlSerializerExample.Gpx, data=3

代码如下:

using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

[XmlRoot("gpx")]
public class Gpx {
[XmlElement("data")] public int Data;
}

[XmlRoot("gpx", Namespace = "http://www.topografix.com/GPX/1/0")]
public class GpxV1 : Gpx {}

[XmlRoot("gpx", Namespace = "http://www.topografix.com/GPX/1/1")]
public class GpxV2 : Gpx {}

internal class Program {
private static void Main() {
var xmlExamples = new[] {
"<gpx xmlns='http://www.topografix.com/GPX/1/0'><data>1</data></gpx>",
"<gpx xmlns='http://www.topografix.com/GPX/1/1'><data>2</data></gpx>",
"<gpx><data>3</data></gpx>",
};

var serializers = new[] {
new XmlSerializer(typeof (Gpx)),
new XmlSerializer(typeof (GpxV1)),
new XmlSerializer(typeof (GpxV2)),
};

foreach (var xml in xmlExamples) {
var textReader = new StringReader(xml);
var xmlReader = XmlReader.Create(textReader);

foreach (var serializer in serializers) {
if (serializer.CanDeserialize(xmlReader)) {
var gpx = (Gpx)serializer.Deserialize(xmlReader);
Console.WriteLine("Deserialized, type={0}, data={1}", gpx.GetType(), gpx.Data);
}
}
}
}
}

关于c# - 如何使用 XmlSerializer 来处理不同的命名空间版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9869759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com