如何删除 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
。
这与为 xsi
和 xsd
提供和 XmlSerializerNamespaces
包含前缀/名称空间相同,这就是为什么您看到 xsi
和 xsi
的声明默认 xsd
。
'remove' xsd
的正确做法是提供一个 XmlSerializerNamespaces
不包含该前缀/命名空间的实例。
我正在使用 .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
。
这与为 xsi
和 xsd
提供和 XmlSerializerNamespaces
包含前缀/名称空间相同,这就是为什么您看到 xsi
和 xsi
的声明默认 xsd
。
'remove' xsd
的正确做法是提供一个 XmlSerializerNamespaces
不包含该前缀/命名空间的实例。