2015-01-21 3 views
0

Я использую атрибуты XmlSerializer и XmlType/XmlAttribute для сериализации и десериализации XML-объекта контейнера.XML-сериализация объекта в другой формат вывода

Входной XML:

<row identifier="blah" firstname="blah" lastname="blah" /> 

И объект:

<Serializable(), XmlType("row")> _ 
Public Class RowEmployee 
    <XmlAttribute("identifier")> _ 
    Public EmployeeIdentifier As String 

    <XmlAttribute("firstname")> _ 
    Public FirstName As String 

    <XmlAttribute("middlename")> _ 
    Public MiddleName As String 

    <XmlAttribute("lastname")> _ 
    Public LastName As String 

End Class 

Этот подход хороший и чистый/простой, соответствует формату входного XML и будет переводить и из XML просто отлично, только проблема в том, что мой выходной XML немного отличается в формате, например

<employee Identifier="blah" FirstName="blah" .....> 

У меня нет большого опыта работы с XSLT, но я отчасти предполагая, что бы путь с этим. Существуют ли какие-либо другие подходы, которые были бы проще, чем XSLT, учитывая такую ​​настройку?

Кроме того, если кто-либо знает какие-либо хорошие ресурсы для «краш-курса» при использовании XSLT с .NET в подобном контексте, это было бы очень признательно.

ответ

0

Re: @ afrogonabike Ответит, да, у меня есть класс контейнера я приукрасил для десериализации на объект:

<Serializable(), XmlRoot("data"), XmlType("data")> _ 
Public Class AesopEmployeeCollection 
    <XmlElement("row")> _ 
    Public Employees As List(Of AesopEmployee) 

    Public Sub New() 
     Me.Employees = New List(Of AesopEmployee)() 
    End Sub 

    Public Function GetEmployeeInfo(AesopId As String) As AesopEmployee 
     Return (From e In Employees Where e.EmployeeIdentifier = AesopId).FirstOrDefault() 
    End Function 
End Class 

я в конечном итоге происходит с помощью XSLT, и преобразование было на самом деле довольно проста:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="row"> 
    <employees> 
     <employee> 
      <xsl:attribute name="Identifier"> 
       <xsl:value-of select="@identifier" /> 
      </xsl:attribute> 
      <xsl:attribute name="FirstName"> 
       <xsl:value-of select="@firstname" /> 
      </xsl:attribute> 
      <!-- dont send middlename if blank --> 
      <xsl:if test="string-length(@middlename)!=0"> 
       <xsl:attribute name="MiddleName"> 
        <xsl:value-of select="@middlename" /> 
       </xsl:attribute> 
      </xsl:if> 
      <xsl:attribute name="LastName"> 
       <xsl:value-of select="@lastname" /> 
      </xsl:attribute> 
      ...... 
     </employee> 
    </employees> 
</xsl:template> 

</xsl:stylesheet> 

логика сериализация/преобразование не было слишком плох:

 Dim Ms As New System.IO.MemoryStream() 
     Dim Xslt As New XslCompiledTransform() 
     Xslt.Load(System.Web.HttpContext.Current.Server.MapPath("/MyRoot/Xslt/EmployeeInfo.xslt")) 

     Using Xtw As New System.Xml.XmlTextWriter(Ms, System.Text.Encoding.UTF8) 
      SharedInfo.EmpSerializer.Serialize(Xtw, RowEmp) 
      Ms = DirectCast(Xtw.BaseStream, System.IO.MemoryStream) 
      Ms.Seek(0, SeekOrigin.Begin) 
      Dim XmlReader As New XmlTextReader(Ms) 
      Dim sb As New StringBuilder() 
      Dim WriterSettings As New XmlWriterSettings() 
      WriterSettings.OmitXmlDeclaration = True 
      Using XmlWriter As XmlWriter = XmlWriter.Create(sb, WriterSettings) 
       Xslt.Transform(XmlReader, XmlWriter) 
       Dim XmlResponse = EmpImportService.AddOrUpdate(sb.ToString(), ServiceApiKey) 

       For Each ResponseNode As XmlNode In XmlResponse.ChildNodes 
        ResponseMessage.Append("<li>").Append(ResponseNode.Attributes("message").Value).Append("</li>") 
       Next 
      End Using 
     End Using 
0

Вы хотите, чтобы каждый класс RowEmployee был сериализован как элемент «row» в xml? Вам нужно будет указать это как ElementName, где этот класс используется, например:

[XmlElement("row")] 
public rows As List(Of RowEmployee) 
+0

Извините за задержку. Я замаскировал класс контейнеров для этих сотрудников, и, по-видимому, я напарник на мини-Markdown. См. Мой ответ ниже. –

Смежные вопросы