Artigo: 251354 - Última revisão: quinta-feira, 1 de Julho de 2004 - Revisão: 3.2

Como localizar e substituir caracteres especiais num documento XML com o Visual Basic

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Reduzir tudo

Sumário

XML predefine cinco referências de entidade para caracteres especiais que caso contrário, seria interpretados como parte da linguagem de marcação. Estas cinco são apresentados como segue:
Entity Reference                Character 

     &                        & 
  
     &lt:                         < 

     &gt                         > 

     &quot;                       " 

     &apos;                       '                    
				
quando criar um documento XML, tem entrada destes caracteres especiais adequadamente para assegurar a apresentação de análise, interpretação e dados adequada. Quando cria um documento XML a partir do Visual Basic, uma forma para procurar estes caracteres especiais e substitua a referência de entidade adequado é utilizar a função Substituir .

Nota : Microsoft Visual Basic 6.0 e posteriores produtos e Microsoft Office 98 e posteriores produtos são fornecidos com uma função Substituir está incorporada.

Mais Informação

O exemplo seguinte abre um conjunto de registos ADO, cria elementos de documento para os registos e guarda os dados como um documento XML utilizando o objeto FileSystemObject . Antes de guardar o ficheiro, no entanto, o conteúdo é procurado caracteres especiais e substituído com as referências de entidade XML adequado para esses caracteres utilizando o método Substituir .

Nota : para simplicidade de demonstração, as instruções são para uma procura e substituir para o carácter ' e ' comercial (&) no seguinte exemplo. A mesma função pode ser aplicada para os outros quatro caracteres bem.
  1. Para executar este exemplo, inicie um novo projecto do Visual Basic Standard Exe. É criado o Form1 por predefinição.
  2. No menu projecto , em References , seleccione o seguinte: Microsoft ActiveX Data Objects Library (2.1 ou posterior)
    Microsoft XML, versão 1.0 ou posterior
    Microsoft Scripting Runtime *
    * O modelo de objectos FileSystemObject está contido na biblioteca de tipo de processamento de scripts.

  3. Desenhar os seguintes controlos no Form1 e defina as respectivas propriedades, conforme listado:
       Control                   Name			   Caption
    Label                  lblFSORecordCount           Record Count:
    Text Box               txtFSORecordCount
    Command Button         cmdOpenAdoFsoRs             Open ADO Recordset	
    Command Button         cmdSaveRSasXMLwithFSO       Save RS as XML using FSO
    Command Button         cmdFsoXmltoTreeView         Place XML Data Into TreeView
    TreeView Control*      xtvFSO
    *The TreeView Control is part of the Windows Common Controls. 
    Therefore, you want to check this off under Components in the Project menu.
    					
  4. No menu Project , adicione um módulo padrão e copie o seguinte para criar as variáveis adequadas necessárias no projecto:
    Option Explicit
    
    Public cn As New adodb.Connection
    Public rs As New adodb.Recordset
    Public myI As Integer
    Public StrTmp As String
    Public Errs1 As Errors
    Public myFSO As New FileSystemObject
    Public myTxtStream As TextStream
    Public myfld As adodb.Field
    Public domdoc As New MSXML.DOMDocument
    Public domdoc As New MSXML2.DOMDocument 'For use with XML 2.6
    
    					
  5. Copie o código seguinte para a secção de declarações geral da janela de código. Nota : substituir as informações de nome do servidor, ID de utilizador e palavra-passe na cadeia de ligação.
    Private Sub cmdOpenAdoFsoRs_Click()
    Screen.MousePointer = vbHourglass
    
    'Check to be sure the connection is not already opened:
    If cn.State = 1 Then
        cn.Close
        Set cn = Nothing
    End If
    
    cn.Open "driver={SQL Server};Server=YourServer;uid=YourUID;pwd=YourPWD;database=Northwind"
    
    'Check to be sure a Recordset is not already opened:
    If rs.State = 1 Then
        rs.Close
        Set rs = Nothing
    End If
    
    With rs
        .CursorLocation = adUseClient
        .CursorType = adOpenKeyset
        .LockType = adLockOptimistic
        .CacheSize = 50
        .Source = "Select CustomerID, " & _
        "CompanyName, ContactName, Region from Customers"
        .ActiveConnection = cn
        .Open
    End With
    
    rs.MoveLast
    rs.MoveFirst
    
    txtFsoRecordCount.Text = rs.RecordCount
    
    Screen.MousePointer = vbNormal
    
    End Sub
    
    Private Sub cmdExit_Click()
    If cn.State = 1 Then
        cn.Close
        Set cn = Nothing
    End If
    
    If rs.State = 1 Then
        rs.Close
        Set rs = Nothing
    End If
    
    Unload Me
    
    End Sub
    
    Private Sub cmdSaveRSasXMLwithFso_Click()
    Screen.MousePointer = vbHourglass
    
    'If the file already exists, first Kill it
    'and then create it.
    'If it does not already exist, simply create it:
    
    On Error GoTo mdkNoSeeEm
    Const mdkNoSeeEm = 53 'File Not Found
    Kill "Customers.xml"
    
    'Note: Unicode data is stored as 2 Bytes per character. This will allow
    'proper parsing of international language characters. However, either
    'omitting or explicitly setting the last 'argument in the CreateTextFile 
    'Method to False will create the file as Ascii. Subsequently, a '"An 
    'Invalid Character Was Found in Text Content" error will occur if these 
    'characters exist in 'the text. Therefore, you use Unicode (True). 
    
    'Create a Text file using the FileSystemObject:
    
    Set myTxtStream = myFSO.CreateTextFile(App.Path & "\Customers.xml", True, True)
    
    'After searching for and replacing special characters with
    'their respective entities (via the ReplaceEntXMLSpecChar Function),
    'write the data to Text File to compile XML Document using the TextStream:
    
    myTxtStream.WriteLine "<?xml version=""1.0"" standalone=""yes""?>"
    myTxtStream.WriteLine "<Customers>"
    
    rs.MoveFirst
    
        Do While Not rs.EOF
    myTxtStream.WriteLine "<Customer>"
    myTxtStream.WriteLine "<CustomerID>" & ReplaceEntXMLSpecChar(rs.Fields("CustomerID") & "", "&", "amp;") & "</CustomerID>"
    myTxtStream.WriteLine "<CompanyName>" & ReplaceEntXMLSpecChar(rs.Fields("CompanyName") & "", "&", "amp;") & "</CompanyName>"
    myTxtStream.WriteLine "<ContactName>" & ReplaceEntXMLSpecChar(rs.Fields("ContactName") & "", "&", "amp;") & "</ContactName>"
    myTxtStream.WriteLine "<Region>" & ReplaceEntXMLSpecChar(rs.Fields("Region") & "", "&", "amp;") & "</Region>"
    myTxtStream.WriteLine "</Customer>"
    rs.MoveNext
    Loop
    
    rs.MoveFirst
    
    myTxtStream.WriteLine "</Customers>"
    
    myTxtStream.Close
    
    Screen.MousePointer = vbNormal
    
    Exit Sub
    
    mdkNoSeeEm:
        If Err.Number = mdkNoSeeEm Then
            Resume Next
        End If
        
    Screen.MousePointer = vbNormal
    
    End Sub
    
    'When this function is applied to each record in the recordset,
    'simply provide the Source to perform the search on, the item
    'to be Searched For and the item to Replace with:
    
    Private Function ReplaceEntXMLSpecChar(ByVal strSource As String, ByVal strSearchFor As String, ByVal strReplace As String) _
        As String
        Dim lngPointer As Long, strNew As String
        lngPointer = InStr(strSource, strSearchFor)
        If lngPointer = 0 Then
            ReplaceEntXMLSpecChar = strSource
        Else
            strNew = Left$(strSource, lngPointer - 1) & strReplace & Mid(strSource, lngPointer + 1, Len(strSource))
            ReplaceEntXMLSpecChar = strNew
        End If
    End Function
    
    Private Sub cmdFsoXmltoTreeView_Click()
    'Fill The TreeView with data from the XML Document:
    
    With DOMdoc
        .async = False
        .Load App.Path & "\customers.xml"
    End With
    
    If DOMdoc.readyState = 4 Then
        xtvFSO.Nodes.Clear
        AddNode DOMdoc.documentElement
    End If
    End Sub
    Private Sub AddNode(ByRef myNode As IXMLDOMNode, Optional ByRef TreeNode As Node)
    
           Dim tvcusterrNode As Node
           Dim tvcusterrNodeList As IXMLDOMNodeList
           Dim i As Long
                    
           If TreeNode Is Nothing Then
               Set tvcusterrNode = xtvFSO.Nodes.Add
           Else
               Set tvcusterrNode = xtvFSO.Nodes.Add(TreeNode, tvwChild)
           End If
              
           tvcusterrNode.Expanded = True
           tvcusterrNode.Text = myNode.nodeName
              
           If tvcusterrNode.Text = "#text" Then
                  tvcusterrNode.Text = myNode.nodeTypedValue
           Else
                  tvcusterrNode.Text = "<" & tvcusterrNode.Text & ">"
      End If
    					
  6. Execute o projecto.
  7. Clique no CommandButton Abrir conjunto de registos ADO para abrir a ligação e conjunto de registos, apresentar um RecordCount.
  8. Clique no CommandButton RS guardar como XML utilizando FSO para analisar os dados, substituir caracteres especiais no conjunto de registos e, em seguida, guardá-lo como um documento XML através de FileSystemObject objecto.
  9. Posteriormente, clique no CommandButton Local FSO dados de XML para TreeView para abrir o ficheiro XML e apresentar os dados no controlo de TreeView.

    Se abrir o documento XML produzido no bloco de notas ou qualquer outro editor de texto e efectuar uma procura para o "e" comercial (&), encontrará:
    Split Rail Beer &amp;
    						
    treeview, este aparece como:
    Split Rail Beer &
    						
Se uma versão mais recente do MSXML tiver sido instalada no modo side-by-side, tem explicitamente utilizar global identificadores exclusivos (globais GUID) de ProgID para essa versão para executar o código de exemplo. Por exemplo, o MSXML 4.0 só pode ser instalado no modo side-by-side. Para obter informações adicionais sobre as alterações de código que são necessários para executar o código de exemplo com o analisador MSXML 4.0, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
305019  (http://support.microsoft.com/kb/305019/EN-US/ ) INFO: O MSXML 4.0 GUID específicos e ProgIds

Referências

Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
308060  (http://support.microsoft.com/kb/308060/EN-US/ ) Como localizar e substituir caracteres especiais num ficheiro XML com o Visual Basic .NET

A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft XML Parser 3.0
  • Microsoft XML Core Services 4.0
Palavras-chave: 
kbmt kbdatabase kbhowto KB251354 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 251354  (http://support.microsoft.com/kb/251354/en-us/ )