我使用.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
属性。
答案 0 :(得分:1)
你所做的一切对我来说是正确的。
您可以查看内部信息,并在未指定任何内容时查看XmlSerializer
使用DefaultNamespaces
。
这与您提供XmlSerializerNamespaces
包含xsi
和xsd
的前缀/命名空间的情况相同,这就是为什么您会看到xsi
和{{的声明的原因1}}默认情况下。
“删除”xsd
的正确做法是提供一个不包含该前缀/命名空间的xsd
实例。
答案 1 :(得分:0)
我也遇到过像你这样的问题。我首先使用linq
但它没有用。后来我发现了一个更好的工具 XSLT 。您可以XSLT
使用{{1}}。