.NET XmlSerializer的,以元FormDefault =不合格的XML?(.NET X

2019-11-03 05:27发布

我用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架构。 本来我建立XSD.EXE类从BizTalk 2006年的架构,然后我用它的参数传递给WCF web服务。

这可能与一个选项叫做元素FormDefault =资格或不合格。 在BizTalk,我有我的模式设置为“Unqualfiied”,这是我想要的。

有没有办法为串行输出“不合格”的结果吗?

谢谢,

尼尔·沃尔特斯

更新:

在日期时间样本属性:

/// <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拉出各个元素的值。 我检查的BizTalk的XPath的一个叫StylusStudio工具,Biztalk'x的XPath没有用的xmlns =“”上述领域工作。

我的WCF web服务做的第一件事就是对象序列化到一个字符串(使用UTF-16的编码),并将其存储在SQL数据库中的XML列。 这是从那里我看到上面的XML样本与的xmlns =“”。

XPath的:

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

Answer 1:

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



Answer 2:

我的问题是有点懵,所以这个答案可能会或可能不会帮助别人。 这是一个相当复杂的情况,以及我的问题一半试图简化它做一个简单的职位这里来了。

我其实是增加了新的元素编程用C#程序(见“为newElement”下文)。 C#代码没有命名空间设置为空字符串,因此,我认为这是继承了“头”元素的命名空间。

我吓坏了一点点,因为我跳到日期时间不应该有“的xmlns =”“”时,实际上它应该,即使日期时间标题下的瀑布,它不会也不应该不继承头的命名空间的结论。

在BizTalk,通常只有复杂类型都有自己的命名空间,日期时间以及为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#程序添加,比去年同期多元素,它能正常工作的话,所以我不怀疑这是造成这个问题。



文章来源: .NET XmlSerializer to Element FormDefault=Unqualified XML?