Поместите атрибуты в файл XML с помощью VBA

Как мне поместить приведенные ниже атрибуты в узел envideclaracaoautodesembaraco моего кода VBA. Я хочу, чтобы мой файл .xml генерировал те же атрибуты, что и в примере ниже.

<enviDeclaracaoAutodesembaraco 
      xmlns = "http://www.sefaz.am.gov.br/autodesembaraco" 
      xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation = "http://www.sefaz.am.gov.br/autodesembaraco enviDeclaracaoMensalAuto_v1.02.xsd">
   <infDeclaracaoMensal versao = "01">
      <ieContribuinteDeclarante>063010712</ieContribuinteDeclarante>
      <anoApresentacao>2024</anoApresentacao>
      <mesApresentacao>01</mesApresentacao>
      <nomeResponsavel>RAI RODRIGUES</nomeResponsavel>
      <foneResponsavel>0000000000</foneResponsavel>
      <emailResponsavel>[email protected]</emailResponsavel>`
      ...snip...

Изображение атрибутов в XML-файле:

Ниже моих кодов, которые экспортируют XML-файл в VBA:

Sub xmlExport()

'On Error GoTo ErrHandle
    
    Dim doc As New MSXML2.DOMDocument60, xslDoc As New MSXML2.DOMDocument60, newDoc As New MSXML2.DOMDocument60
    Dim root As IXMLDOMNode, ItemNode As IXMLDOMNode, yinstanceNode As IXMLDOMNode, UFNode As IXMLDOMElement
    Dim DiaAtributos As IXMLDOMAttribute, Atributos As IXMLDOMAttribute, NFatributos As IXMLDOMAttribute
    Dim Reconhecer As IXMLDOMElement, ValorBs As IXMLDOMElement, chave As IXMLDOMElement, NumNotas As IXMLDOMElement
    Dim NumItens As IXMLDOMElement, Produtos As IXMLDOMElement, NumItemNFe As IXMLDOMElement
    Dim CodInterno As IXMLDOMElement, IndGeral As IXMLDOMElement, IndGeralProdutos As IXMLDOMElement
    Dim TipoTributação As IXMLDOMElement, Multiplicador As IXMLDOMElement, ValorImposto As IXMLDOMElement
    Dim NumeroAtributo As IXMLDOMAttribute, civilityAttrib As IXMLDOMAttribute
    Dim IE As IXMLDOMElement, Ano As IXMLDOMElement, Mes As IXMLDOMElement, Nome As IXMLDOMElement, Fone As IXMLDOMElement, Email As IXMLDOMElement
    Dim ListaNF As IXMLDOMElement, NF As IXMLDOMElement
    Dim nmsp As String
    Dim g As Long

    
    ' NODE PAI '
    nmsp = "http://www.sefaz.am.gov.br/autodesembaraco"
    Set root = doc.createElement("enviDeclaracaoAutodesembaraco")
    doc.appendChild root
    
    Set DiaAtributos = doc.createAttribute("xsischemaLocation")
    DiaAtributos.Value = "http://www.sefaz.am.gov.br/autodesembaraco enviDeclaracaoMensalAuto_v1.02.xsd"
    root.Attributes.setNamedItem DiaAtributos
    
    Set ItemNode = doc.createElement("infDeclaracaoMensal")
    root.appendChild ItemNode
    
    Set Atributos = doc.createAttribute("versao")
    Atributos.Value = "01"
    ItemNode.Attributes.setNamedItem Atributos
    
    Set IE = doc.createElement("ieContribuinteDeclarante")
    IE.Text = Range("b2").Value
    ItemNode.appendChild IE

    Set Ano = doc.createElement("anoApresentacao")
    Ano.Text = Range("c2").Value
    ItemNode.appendChild Ano

    Set Mes = doc.createElement("mesApresentacao")
    Mes.Text = Range("d2").Value
    ItemNode.appendChild Mes
    
    Set Nome = doc.createElement("nomeResponsavel")
    Nome.Text = Range("e2").Value
    ItemNode.appendChild Nome

    Set Fone = doc.createElement("foneResponsavel")
    Fone.Text = Range("f2").Value
    ItemNode.appendChild Fone
    
    Set Email = doc.createElement("emailResponsavel")
    Email.Text = Range("g2").Value
    ItemNode.appendChild Email
    
    Set ListaNF = doc.createElement("listaNotasFiscais")
    ItemNode.appendChild ListaNF
    
     
    
 For g = 2 To Sheets(1).UsedRange.Rows.Count
 
    NumeroItemNfe = Cells(g, 15)
 
 If NumeroItemNfe = 1 Then
    
    Set NF = doc.createElement("notaFiscal")
    ListaNF.appendChild NF
    
    Set NFatributos = doc.createAttribute("numOrdemNota")
    NFatributos.Value = Range("h" & g)
    NF.setAttributeNode NFatributos
    
    Set chave = doc.createElement("chaveNFe")
    chave.Text = Range("j" & g)
    NF.appendChild chave
    
    Set Reconhecer = doc.createElement("reconheceNFe")
    Reconhecer.Text = Range("L" & g)
    NF.appendChild Reconhecer
    
    Set NumItens = doc.createElement("numItens")
    NumItens.Text = Range("M" & g)
    NF.appendChild NumItens
    
    'Else
    
    'GoTo ProximaInteracao
    
    End If
    
'ProximaInteracao:

    Set Produtos = doc.createElement("produto")
    NF.appendChild Produtos

    Set NumItemNFe = doc.createElement("numItemNFe")
    NumItemNFe.Text = Range("O" & g)
    Produtos.appendChild NumItemNFe

    Set CodInterno = doc.createElement("codInternoProduto")
    CodInterno.Text = Range("P" & g)
    Produtos.appendChild CodInterno

    Set IndGeral = doc.createElement("indiceCodGeralProduto")
    IndGeral.Text = Range("Q" & g)
    Produtos.appendChild IndGeral

    Set IndGeralProdutos = doc.createElement("codGeralProduto")
    IndGeralProdutos.Text = Range("R" & g)
    Produtos.appendChild IndGeralProdutos
    
    Set TipoTributação = doc.createElement("codTipoTributacao")
    TipoTributação.Text = Range("S" & g)
    Produtos.appendChild TipoTributação
    
    Set ValorBs = doc.createElement("valorBaseCalculoItem")
    ValorBs.Text = Replace(Format(Range("T" & g), "0.00"), ",", ".")
    Produtos.appendChild ValorBs
    
    Set Multiplicador = doc.createElement("valorMultiplicador")
    Multiplicador.Text = Replace(Format(Range("U" & g), "0.00"), ",", ".")
    Produtos.appendChild Multiplicador
    
    Set ValorImposto = doc.createElement("valorImpostoDeclarado")
    ValorImposto.Text = Replace(Format(Range("V" & g), "0.00"), ",", ".")
    Produtos.appendChild ValorImposto
    
Next g

    Set NumNotas = doc.createElement("numNotasArquivo")
    NumNotas.Text = Range("W2").Value
    ItemNode.appendChild NumNotas

    
    xslDoc.LoadXML "<?xml version = " & Chr(34) & "1.0" & Chr(34) & "?>" _
            & "<xsl:stylesheet version = " & Chr(34) & "1.0" & Chr(34) _
            & "                xmlns:xsl = " & Chr(34) & "http://www.w3.org/1999/XSL/Transform" & Chr(34) & ">" _
            & "<xsl:strip-space elements = " & Chr(34) & "*" & Chr(34) & " />" _
            & "<xsl:output method = " & Chr(34) & "xml" & Chr(34) & " indent = " & Chr(34) & "yes" & Chr(34) & "" _
            & "            encoding = " & Chr(34) & "UTF-8" & Chr(34) & "/>" _
            & " <xsl:template match = " & Chr(34) & "node() | @*" & Chr(34) & ">" _
            & "  <xsl:copy>" _
            & "   <xsl:apply-templates select = " & Chr(34) & "node() | @*" & Chr(34) & " />" _
            & "  </xsl:copy>" _
            & " </xsl:template>" _
            & "</xsl:stylesheet>"
            

            
    xslDoc.async = False
    doc.transformNodeToObject xslDoc, newDoc
    newDoc.Save baseDirectory & projectName & "C:\Users\raI\Downloads\DIA.xml"
    
    

    MsgBox "Arquivo XML gerado com sucesso!", vbInformation
    Exit Sub

'ErrHandle:
    'MsgBox Err.Number & " - " & Err.Description, vbCritical
    Exit Sub

End Sub

Приведенные выше коды в Visual Basic для экспорта приложения в XML-файл данных Excel.

Как выглядел XML-файл после изменения кода согласно предложению.

<enviDeclaracaoAutodesembaraco xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns = "http://www.sefaz.am.gov.br/autodesembaraco" xsi:schemaLocation = "http://www.sefaz.am.gov.br/autodesembaraco enviDeclaracaoMensalAuto_v1.02.xsd">
  <infDeclaracaoMensal xmlns = "" versao = "01">

Вам следует избегать написания всего вопроса ЗАГЛАВНЫМИ БУКВАМИ - обычно это считается КРИКОМ на вашу аудиторию, это грубо и оскорбительно и значительно снижает ваши шансы на то, что люди потратят время, чтобы прочитать ваш вопрос и дать ответ. Не делай этого – просто не делай этого.

marc_s 19.03.2024 13:41

Спасибо за подсказку, я здесь новичок и еще не разбираюсь в том, как пользоваться платформой.

Raí Rodrigues 19.03.2024 13:57

К вашему сведению, создание большого количества XML-элементов шаг за шагом может оказаться довольно повторяющимся: рассмотрите один или два служебных метода для обработки повторяющихся частей за один вызов. Например, см. CreateWithAttributes здесь - stackoverflow.com/a/70089478/478884

Tim Williams 19.03.2024 17:24
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
3
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что основные проблемы, с которыми вы столкнулись, - это добавление атрибутов к корневому элементу:

  • xmlns = "http://www.sefaz.am.gov.br/autodesembaraco"
  • xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
  • xsi:schemaLocation = "http://www.sefaz.am.gov.br/autodesembaraco enviDeclaracaoMensalAuto_v1.02.xsd"

Проблема заключалась в том, как вы создаете местоположение схемы пространств имен:

Dim doc As New MSXML2.DOMDocument60
Dim root As IXMLDOMNode
Dim nmsp As String, xsi As String, schemaLocation As String

' namespaces and schema location
nmsp = "http://www.sefaz.am.gov.br/autodesembaraco"
xsi = "http://www.w3.org/2001/XMLSchema-instance"
schemaLocation = "http://www.sefaz.am.gov.br/autodesembaraco enviDeclaracaoMensalAuto_v1.02.xsd"
  1. Создайте корневой элемент, передав пространство имен:
' Create the root element - with namespace - by using createNode (NODE_ELEMENT = 1)
Set root = doc.createNode(NODE_ELEMENT, "enviDeclaracaoAutodesembaraco", nmsp)
doc.appendChild root
  1. Объявите пространство имен xsi:
' Add xmlns:xsi attribute
Set xsiAttr = doc.createAttribute("xmlns:xsi")
xsiAttr.Value = xsi
root.Attributes.setNamedItem xsiAttr
  1. Добавьте schemaLocation:
' Add xsi:schemaLocation attribute
Set schemaLocationAttr = doc.createAttribute("xsi:schemaLocation")
schemaLocationAttr.Value = schemaLocation

Привет, Ян, как дела? Большое спасибо за помощь, я сделал как вы посоветовали, атрибуты появились, но перед атрибутом "xmlns" появляется атрибут "xmlns:xsi", могу ли я это преобразовать? Другой вопрос: в узле «infDeclaraçãoMonsal» атрибут «xmlns» отображается за атрибутом «version: 01». Можно ли каким-либо образом удалить этот атрибут xmlns из этого узла? Я отвечу на свой вопрос, объяснив, как это произошло.

Raí Rodrigues 19.03.2024 16:32

@RaíRodrigues Можете ли вы показать XML, который вы сейчас получаете - не весь; только корневой элемент и его атрибуты.

Ian Boyd 19.03.2024 17:48

Второй выпуск: stackoverflow.com/questions/13220095/…

Tim Williams 19.03.2024 17:58

@IanBoyd Я разместил запрошенную информацию в конце своего вопроса.

Raí Rodrigues 19.03.2024 18:57

Другие вопросы по теме

Похожие вопросы