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

How to remove the xmlns:xsd attribute but keep xmlns:xsi

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

根元素最终应如下所示:

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

在部分class中(加入由xsd.exe创建的部分class),我添加了以下属性以添加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属性。

我也遇到了你这样的问题。我首先使用 linq 但它没有用。后来找到了更好的工具XSLT。您可以像 Online.

这样使用 XSLT

我认为你所做的是正确的。

您可以查看内部结构,当指定 none 时,XmlSerializer 使用 DefaultNamespaces

这与为 xsixsd 提供和 XmlSerializerNamespaces 包含前缀/名称空间相同,这就是为什么您看到 xsixsi 的声明默认 xsd

'remove' xsd 的正确做法是提供一个 XmlSerializerNamespaces 不包含该前缀/命名空间的实例。