Проблема множественного пространства имен в .net XMLSerializer - PullRequest
1 голос
/ 27 января 2010

У меня проблема с использованием объекта .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 голосов
/ 28 января 2010

Хотя сейчас я думаю, что существующее решение подходит для моих требований, есть способ достичь того, что мне нужно.

Объявите объект 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")

Andrew

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...