【问题标题】:.NET XmlSerializer to Element FormDefault=Unqualified XML?.NET XmlSerializer 到 Element FormDefault=Unqualified XML?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 这是一个已经修正的错字。就像我说的,我尽量不包括完整的样本——它太大了。我习惯使用 Stylus Studio 进行测试,类似于 XMLSpy,但还没有新客户端。但发现了这个:mizar.dk/XPath/Default.aspx。我现在正在那里进行测试,上面的小例子似乎都在工作,而我的真实数据到目前为止还没有工作。我需要几分钟来做实验。昨晚,在 Stylus Studio 中它不起作用......
  • @Neal:固定在哪里?它仍然在你的问题中。顺便说一句,我在 XMLSpy 中测试过,问题很明显。
【解决方案2】:

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

我实际上是使用 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>

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

一年多前我已经编写了添加元素的 C# 例程,当时它运行良好,所以我不怀疑它导致了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多