我使用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()='']
答案 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#例程来添加元素,然后它工作得很好,所以我并不怀疑它是导致这个问题的原因。