如何删除xmlns:xsd属性但保留xmlns:xsi

时间:2017-08-09 11:23:35

标签: c# xml xsd schema xml-namespaces

我使用.Net XmlSerializer在C#Windows窗体应用程序中将对象序列化为XML文档。

根元素应该看起来像:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="file:///C:/data//MySchema.xsd">
  <!-- ... -->
</root>  

在部分类中(要加入由xsd.exe创建的部分类),我添加了以下属性以添加xsi:noNamespaceSchemaLocation属性。

[XmlAttribute("noNamespaceSchemaLocation", Namespace = XmlSchema.InstanceNamespace)]
public string xsiNoNamespaceSchemaLocation = @"file:///C://data//MySchema.xsd";

要删除所有其他名称空间,但请保留我使用的xsi名称空间:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");

然后将ns传递给XmlSerializer.Serialize()方法。

到目前为止这是有效的,但我不确定这是否正确。感觉就像我正在删除默认情况下的内容,只是尝试再添加一块它...看起来像代码味道。

也许有更好的方法只删除xsd但保留默认xsi,所以我不需要再次添加它?

注意:从某个时间开始here已经有一个未回答的问题,唯一建议的答案不合适,因为它删除了xsd xsi属性。

2 个答案:

答案 0 :(得分:1)

你所做的一切对我来说是正确的。

您可以查看内部信息,并在未指定任何内容时查看XmlSerializer使用DefaultNamespaces

这与您提供XmlSerializerNamespaces包含xsixsd的前缀/命名空间的情况相同,这就是为什么您会看到xsi和{{的声明的原因1}}默认情况下。

“删除”xsd的正确做法是提供一个不包含该前缀/命名空间的xsd实例。

答案 1 :(得分:0)

我也遇到过像你这样的问题。我首先使用linq但它没有用。后来我发现了一个更好的工具 XSLT 。您可以XSLT使用{{1}}。