.NET XmlSerializer到Element FormDefault =不合格的XML?

时间:2010-03-09 16:27:26

标签: c# xml xml-serialization schema

我使用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服务的参数。

这可能与名为ElementDefault = Qualified或Unqualified的选项有关。在BizTalk中,我的架构设置为“Unqualfiied”,这就是我想要的。

序列化程序有没有办法输出“不合格”的结果?

谢谢,

Neal Walters

更新:

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列中。从那里我看到上面的xml样本与xmlns =“”。

XPath:

/*[local-name()='Header' and namespace-uri()='https://mynamespace/']/*[local-name()='DateTime' and namespace-uri()='']

2 个答案:

答案 0 :(得分:0)

您使用的XPATH与XML的名称空间不匹配。例如,Header中的https://mynamespace/元素,但您的XPATH正在http://mynamespace/命名空间中搜索。

答案 1 :(得分:0)

我的问题有点混乱,所以这个答案可能会或可能不会帮助某人。 这是一个相当复杂的场景,我的一半问题来自于试图简化它以便在这里轻松发布。

我实际上是使用C#例程以编程方式添加新元素(请参阅下面的“NewElement”)。 C#代码没有将其命名空间设置为空字符串,因此我相信它继承了“Header”元素的命名空间。

我吓坏了一点因为我得出的结论是DateTime不应该有“xmlns =”“',实际上应该是这样。即使DateTime属于Header,它也不会也不应该继承Header的命名空间。

在BizTalk中,通常只有复杂类型有自己的命名空间,而DateTime和NewElement都是简单类型。

 <Header xmlns="https://mynamespace/">
    <SchemaVersion xmlns="">V109</SchemaVersion>
    <DateTime xmlns="">2010-03-08T18:21:09.100125-08:00</DateTime>
    <NewElement>myvalue</NewElement>

所以实际上,我发布的两个XML最初是相同的,就XPath而言。如果我插入一个新元素,我需要确保它遵循相同的模式。

我在一年多前编写了C#例程来添加元素,然后它工作得很好,所以我并不怀疑它是导致这个问题的原因。