【发布时间】:2010-03-09 16:27:26
【问题描述】:
我或多或少地使用 C# 代码将对象序列化为 XML:
XmlSerializer xs1 = new XmlSerializer(typeof(YourClassName));
StreamWriter sw1 = new StreamWriter(@"c:\DeserializeYourObject.xml");
xs1.Serialize(sw1, objYourObjectFromYourClassName);
sw1.Close();
我希望它像这样序列化:
<ns0:Header xmlns:ns0="https://mynamespace/">
<SchemaVersion>1.09</SchemaVersion>
<DateTime>2009-12-15T00:00:01-08:00</DateTime>
但是,它正在这样做:
<Header xmlns="https://mynamespace/">
<SchemaVersion xmlns="">V109</SchemaVersion>
<DateTime xmlns="">2010-03-08T18:21:09.100125-08:00</DateTime>
它的序列化方式不适用于我计划使用的 XPath,并且与我的 BizTalk 架构不匹配。最初,我使用 BizTalk 2006 架构中的 XSD.exe 构建了该类,然后将其用作 WCF Web 服务的参数。
这可能与名为元素 FormDefault = Qualified 或 Unqualified 的选项有关。在 BizTalk 中,我将架构设置为“不合格”,这正是我想要的。
序列化器有没有办法输出“不合格”的结果?
谢谢,
尼尔·沃尔特斯
更新:
DateTime 上的示例属性:
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public System.DateTime DateTime
{
get
{
return this.dateTimeField;
}
set
{
this.dateTimeField = value;
}
}
BizTalk 提供了所谓的提升(或区分)字段,这些字段使用 XPath 提取单个元素的值。我在一个名为 StylusStudio 的工具中检查了 BizTalk 的 XPath,并且 Biztalk'x xpath 不适用于上面的 xmlns='' 字段。
我的 WCF Web 服务所做的第一件事是将对象序列化为字符串(使用 UTF16 编码)并将其存储在 SQL 数据库的 XML 列中。从那里我看到了上面带有 xmlns="" 的 xml 示例。
XPath:
/*[local-name()='Header' and namespace-uri()='https://mynamespace/']/*[local-name()='DateTime' and namespace-uri()='']
【问题讨论】:
-
您将哪些属性应用于您的类和属性?
-
我在我的界面上使用 [XmlSerializerFormat]。我希望类/属性上的属性与 xsd.exe 生成的完全一样,因此我随时更改架构和重新生成类。
-
我用 DateTime 属性的示例更新了原始帖子。
-
你真的使用“ns0”命名空间吗?
-
@John ns0 是在 Biztalk 中生成符合架构的 XML 实例的示例。一个人可以使用他想要的任何前缀,但 BizTalk 只是以 ns0 开头,然后是 ns1、ns2 等......
标签: c# xml xml-serialization schema