Compartilhar via


Como transformar XML usando LINQ (Visual Basic)

Literais XML facilitam a leitura de XML de uma fonte e a transformam em um novo formato XML. Você pode aproveitar as consultas LINQ para recuperar o conteúdo a ser transformado ou alterá-lo em um documento existente para um novo formato XML.

O exemplo neste tópico transforma o conteúdo de um documento de origem XML em HTML a ser exibido em um navegador.

Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos elementos de interface do usuário do Visual Studio nas instruções a seguir. A edição do Visual Studio que você possui e as configurações que você usa determinam esses elementos. Para obter mais informações, consulte Personalizando o IDE.

Para transformar um documento XML

  1. No Visual Studio, crie um novo projeto de Visual Basic no modelo de projeto do Aplicativo de Console.

  2. Clique duas vezes no arquivo Module1.vb criado no projeto para modificar o código do Visual Basic. Adicione o código a seguir ao Sub Main do módulo Module1. Esse código cria o documento XML de origem como um objeto XDocument.

    Dim catalog =
      <?xml version="1.0"?>
        <Catalog>
          <Book id="bk101">
            <Author>Garghentini, Davide</Author>
            <Title>XML Developer's Guide</Title>
            <Price>44.95</Price>
            <Description>
              An in-depth look at creating applications
              with <technology>XML</technology>. For
              <audience>beginners</audience> or
              <audience>advanced</audience> developers.
            </Description>
          </Book>
          <Book id="bk331">
            <Author>Spencer, Phil</Author>
            <Title>Developing Applications with Visual Basic .NET</Title>
            <Price>45.95</Price>
            <Description>
              Get the expert insights, practical code samples,
              and best practices you need
              to advance your expertise with <technology>Visual
              Basic .NET</technology>.
              Learn how to create faster, more reliable applications
              based on professional,
              pragmatic guidance by today's top <audience>developers</audience>.
            </Description>
          </Book>
        </Catalog>
    

    Como carregar XML a partir de um arquivo, cadeia de caracteres ou fluxo.

  3. Após o código para criar o documento XML de origem, adicione o código a seguir para recuperar todos os elementos <Book> do objeto e transformá-los em um documento HTML. A lista de elementos <Book> é criada usando uma consulta LINQ que retorna uma coleção de objetos XElement que contêm o HTML transformado. Você pode usar expressões inseridas para colocar os valores do documento de origem no novo formato XML.

    O documento HTML resultante é gravado em um arquivo usando o método Save.

    Dim htmlOutput =
      <html>
        <body>
          <%= From book In catalog.<Catalog>.<Book>
              Select <div>
                       <h1><%= book.<Title>.Value %></h1>
                       <h3><%= "By " & book.<Author>.Value %></h3>
                        <h3><%= "Price = " & book.<Price>.Value %></h3>
                        <h2>Description</h2>
                        <%= TransformDescription(book.<Description>(0)) %>
                        <hr/>
                      </div> %>
        </body>
      </html>
    
    htmlOutput.Save("BookDescription.html")
    
  4. Após Sub Main de Module1, adicione um novo método (Sub) para transformar um nó <Description> no formato HTML especificado. Esse método é chamado pelo código na etapa anterior e é usado para preservar o formato dos elementos <Description>.

    Esse método substitui subconjuntos do elemento <Description> por HTML. O método ReplaceWith é usado para preservar o local dos subconjuntos. O conteúdo transformado do elemento <Description> está incluído em um elemento de parágrafo (<p>) HTML. A propriedade Nodes é usada para recuperar o conteúdo transformado do elemento <Description>. Isso garante que os subconjuntos sejam incluídos no conteúdo transformado.

    Adicione o seguinte código após Sub Main ou Module1.

    Public Function TransformDescription(ByVal desc As XElement) As XElement
    
      ' Replace <technology> elements with <b>.
      Dim content = (From element In desc...<technology>).ToList()
    
      If content.Count > 0 Then
        For i = 0 To content.Count - 1
          content(i).ReplaceWith(<b><%= content(i).Value %></b>)
        Next
      End If
    
      ' Replace <audience> elements with <i>.
      content = (From element In desc...<audience>).ToList()
    
      If content.Count > 0 Then
        For i = 0 To content.Count - 1
          content(i).ReplaceWith(<i><%= content(i).Value %></i>)
        Next
      End If
    
      ' Return the updated contents of the <Description> element.
      Return <p><%= desc.Nodes %></p>
    End Function
    
  5. Salve suas alterações.

  6. Pressione F5 para executar o código. O documento salvo resultante será semelhante ao seguinte:

    <?xml version="1.0"?>
    <html>
      <body>
        <div>
          <h1>XML Developer's Guide</h1>
          <h3>By Garghentini, Davide</h3>
          <h3>Price = 44.95</h3>
          <h2>Description</h2>
          <p>
            An in-depth look at creating applications
            with <b>XML</b>. For
            <i>beginners</i> or
            <i>advanced</i> developers.
          </p>
          <hr />
        </div>
        <div>
          <h1>Developing Applications with Visual Basic .NET</h1>
          <h3>By Spencer, Phil</h3>
          <h3>Price = 45.95</h3>
          <h2>Description</h2>
          <p>
            Get the expert insights, practical code
            samples, and best practices you need
            to advance your expertise with <b>Visual
            Basic .NET</b>. Learn how to create faster,
            more reliable applications based on
            professional, pragmatic guidance by today's
            top <i>developers</i>.
          </p>
          <hr />
        </div>
      </body>
    </html>
    

Confira também