.net XMLSerializer多个命名空间问题

时间:2010-01-27 14:36:13

标签: .net xml serialization

我在使用.net XMLSerializer对象和XML命名空间时遇到了问题。我对XMLSerializer的体验非常有限,我之前没有使用过XML。我正在尝试以下内容:

<Record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
  <Property1>blah</Property1> 
  <oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"   xmlns:dc="http://purl.org/dc/elements/1.1/">>
    <dc:Property2>asdsd</dc:Property2> 
    <dc:Property3>asdasasdda</dc:Property3> 
  </oai_dc:dc>
</Record>

然而,我现在能得到的最好的是(注意名称空间声明的位置)

<Record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <Property1>blah</Property1> 
    <oai_dc:dc>
      <dc:Property2>asdsd</dc:Property2> 
      <dc:Property3>asdasasdda</dc:Property3> 
  </oai_dc:dc>
</Record>

命名空间在根元素中声明,而不是在我想要的dc元素上声明。我理解,要么在根中声明命名空间,要么使用命名空间的元素应该是可接受的。

我正在附加XMLSerializerNamespaces,如下所示:

Dim XMLNamespaces As New XmlSerializerNamespaces()
        XMLNamespaces.Add("oai_dc", "http://www.openarchives.org/OAI/2.0/oai_dc/")
        XMLNamespaces.Add("dc", "http://purl.org/dc/elements/1.1/")
        XMLNamespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance")

XMLSerializer.Serialize(XMLWriter, inputObject, XMLNamespaces)

我正在使用的对象如下所示:

<XmlRoot("Record")> _
Public Class Record

    <XmlElement("Property1")> _
    Public Property1 As String

    <XmlElement("dc", Namespace:="http://www.openarchives.org/OAI/2.0/oai_dc/")> _
    Public DCMetadata As DublinCore

    Public Sub New()
        DCMetadata = New DublinCore()
    End Sub

End Class


<XmlRoot("dc", Namespace:="http://www.openarchives.org/OAI/2.0/oai_dc/")> _
Public Class DublinCore

    <XmlElement("Property2", Namespace:="http://purl.org/dc/elements/1.1/")> _
    Public Property2 As String

    <XmlElement("Property3", Namespace:="http://purl.org/dc/elements/1.1/")> _
    Public Property3 As String

    Public Sub New()

    End Sub

End Class

有没有办法强制XMLSerializer针对树下面的元素输出命名空间声明?

感谢您提供任何意见,

安迪

1 个答案:

答案 0 :(得分:0)

虽然我现在认为现有的解决方案对我的要求有效,但有一种方法可以实现我的需要。

在要序列化的类中声明一个XmlSerializerNamespaces对象。

<XmlNamespaceDeclarations()> _
    Public xmlns As XmlSerializerNamespaces

然后将名称空间添加到此集合中,而不是直接将其附加到序列化程序。这具有声明使用它的命名空间所需的效果。

xmlns = New XmlSerializerNamespaces()
        xmlns.Add("oai_dc", "http://www.openarchives.org/OAI/2.0/oai_dc/")
        xmlns.Add("dc", "http://purl.org/dc/elements/1.1/")
        xmlns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance")

安德鲁