【发布时间】:2018-01-23 01:39:59
【问题描述】:
我使用 xsd2code++ 创建了一个序列化对象。它工作正常,除了以下内容:
出于某种原因,我需要发送的 XML 需要有一些命名空间,但不是 xsd 的(即使,据我了解,列出它应该没有问题,但这不是我的要求)。我在生成的 c# 类中有以下代码:
[XmlNamespaceDeclarations]
public XmlSerializerNamespaces xmlns;
[XmlAttribute("schemaLocation", Namespace = XmlSchema.InstanceNamespace)]
public string xsiSchemaLocation = "http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd";
public TimbreFiscalDigital()
{
this.versionField = "1.1";
this.xmlns = new XmlSerializerNamespaces();
this.xmlns.Add("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital");
this.xmlns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
}
在类本身的属性中,我有以下内容:
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.sat.gob.mx/TimbreFiscalDigital")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.sat.gob.mx/TimbreFiscalDigital", IsNullable = false)]
但 XML 包含 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 命名空间声明。
我在这里看到了关于如何完全删除用于序列化的命名空间的不同答案,但这不是我想要的,我只是希望我设置的那些是唯一序列化的。
有什么方法可以删除 xsd,而无需使用自定义 xml 序列化程序或类似的东西?我觉得可能有一些我可以设置的属性或选项(或者我设置不正确)会影响到这一点,但我在对象的代码中没有看到对xsd 的任何引用。我已经通过XmlSerializer.Serialize() 直接调用序列化程序了。
【问题讨论】:
-
1) 您是直接调用序列化程序,还是被某些框架间接调用? 2) 我在这里看到了关于如何完全删除用于序列化的命名空间的不同答案 - 哪些答案?如果您手动进行序列化,您可以使用 this answer 删除
xsd和xsi命名空间 - 然后手动添加xsi命名空间。 -
@dbc 1) 我直接调用序列化程序。 2)这是我看到的问题/答案之一。对于我所看到的,我已经在这样做了:我正在创建
XmlSerializerNamespaces并添加我想要的那些,但xsd仍然不断出现。我将尝试先添加 Empty 一个,然后添加我需要的 2 个,看看它是否会改变事情。 - 我检查了代码并且对Serialize的调用没有包含最后一个参数。我不确定我添加的命名空间是如何添加的,但我正在尝试添加该参数,看看是否只有我需要的 2 个出现。 -
我无法重现该问题,请参阅dotnetfiddle.net/hZksl8。然而,我能够看到
"http://www.sat.gob.mx/TimbreFiscalDigital"命名空间出现在两个单独的命名空间属性中。我可以通过将XmlSerializerNamespaces直接传递给XmlSerializer.Serialize()来解决这个问题。你能提供一个minimal reproducible example 来演示插入xsd命名空间的情况吗? -
@dbc 是的,将 xmlns 实例传递给
XmlSerializer.Serialize()可以解决问题。奇怪的是,显然您不需要传递该参数以显示使用的命名空间(tfd 和 xsi),但只有它们出现,您需要传递参数。 -
这在最后一个 remark for
XmlNamespaceDeclarationsAttribute中的记录模糊且记录不佳:还请注意,应用该属性的成员仅包含属于定义的 XML 元素的前缀-命名空间对 这基本上意味着 子元素 使用前缀而不是当前元素 - 所以它并不能真正按预期或根元素想要的那样工作。
标签: c# xml xml-serialization xmlserializer