在我解释如何做你想做的事情之前,重要的是要意识到 XML 阅读器/解析器通常不关心你在元素上添加什么前缀。他们只关心完整的命名空间。
换句话说,当您的示例 XML 片段被加载时,该ns1
位被完全丢弃。在内部,您得到的是 XML 名称空间/元素对,例如("http://www.opentravel.org/OTA/2003/05", "Response")
或("http://www.opentravel.org/OTA/2003/05", "Date")
. 了解这一点很重要的原因是,您可以为 XML 数据分配不同的名称空间前缀以供 XPath 等使用,这样就可以正常工作。也就是说,我可以将您的 XML 片段读入我的程序,并说"http://www.opentravel.org/OTA/2003/05"
应该映射到前缀"t"
,并使用 XPath 之类//t:Response
的方法来获得正确的结果,即使源 XML 数据没有t
前缀。
换句话说,您真的,真的不应该费心尝试将特定的XML 名称空间前缀添加到您的 XML 中,因为这无关紧要。如果有一个特定的前缀是一切正常工作所必需的,那么某个地方的某个人正在做一些非常错误的事情。
话虽如此,如果由于某种原因您需要输出特定的命名空间前缀,或者您只是碰巧喜欢它们的外观,您可以使用XmlSerializerNamespaces
该类,如下所示:
var ns = new XmlSerializerNamespaces();
ns.Add("NS1", "http://www.opentravel.org/OTA/2003/05");
var s = new XmlSerializer(typeof(Response));
var output = new StreamWriter(SOME_FILENAME);
s.Serialize(response, output, ns);
为此,您还必须使用您希望它们所在的完整命名空间Namespace
来装饰您的类。所有 XML 序列化器属性都有一个用于此目的的参数,例如:
[XmlRoot(ElementName = "Response",
Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class Response
{
}
当您序列化您的对象时,序列化程序将在命名空间映射中查找命名空间,并将您选择的前缀应用于适当的元素。