尝试为Excel工作表中的每一行创建新的XML文档
我正在尝试为Excel文件中的每一行创建一个单独的XML文档。第1行列出标记名,A列标识每行的文档标题 我在VBA方面相当缺乏经验,但这是我迄今为止根据对类似问题的多个答案所提出的尝试为Excel工作表中的每一行创建新的XML文档,excel,xml,vba,Excel,Xml,Vba,我正在尝试为Excel文件中的每一行创建一个单独的XML文档。第1行列出标记名,A列标识每行的文档标题 我在VBA方面相当缺乏经验,但这是我迄今为止根据对类似问题的多个答案所提出的 Sub testXLStoXML() sTemplateXML = _ "<?xml version='1.0'?>" + vbNewLine + _
Sub testXLStoXML()
sTemplateXML = _
"<?xml version='1.0'?>" + vbNewLine + _
"<mods xmlns='http://www.loc.gov/mods/v3' xmlns:mods='http://www.loc.gov/mods/v3' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xlink='http://www.w3.org/1999/xlink'>" + vbNewLine + _
sTemplateXML & " <titleInfo>" + vbNewLine + _
sTemplateXML & " <title>" + vbNewLine + _
sTemplateXML & " </title>" + vbNewLine + _
sTemplateXML & " </titleInfo>" + vbNewLine + _
sTemplateXML = sTemplateXML & "<titleInfo>" + vbNewLine
sTemplateXML = sTemplateXML & " <titleInfo>" + vbNewLine
sTemplateXML = sTemplateXML & " </titleInfo>" + vbNewLine
sTemplateXML = sTemplateXML & "</titleInfo>" + vbNewLine + _
sTemplateXML & " <name type='personal'>" + vbNewLine + _
sTemplateXML & " <namePart>" + vbNewLine + _
sTemplateXML & " </namePart>" + vbNewLine + _
sTemplateXML & " <role>" + vbNewLine + _
sTemplateXML & " <roleTerm authority='marcrelator' type='text'>" + vbNewLine + _
sTemplateXML & " </roleTerm>" + vbNewLine + _
sTemplateXML & " </role>" + vbNewLine + _
sTemplateXML & " </name>" + vbNewLine + _
sTemplateXML = sTemplateXML & "<name type='personal'>" + vbNewLine
sTemplateXML = sTemplateXML & " <namePart>" + vbNewLine
sTemplateXML = sTemplateXML & " </namePart>" + vbNewLine
sTemplateXML = sTemplateXML & " <role>" + vbNewLine
sTemplateXML = sTemplateXML & " <roleTerm authority='marcrelator' type='text'>" + vbNewLine
sTemplateXML = sTemplateXML & " </roleTerm>" + vbNewLine
sTemplateXML = sTemplateXML & " </role>" + vbNewLine
sTemplateXML = sTemplateXML & "</name>" + vbNewLine + _
sTemplateXML & " <typeOfResource>text</typeOfResource>" + vbNewLine + _
sTemplateXML & " <genre authority='lctgm'>" + vbNewLine + _
sTemplateXML & " </genre>" + vbNewLine + _
sTemplateXML & " <language>" + vbNewLine + _
sTemplateXML & " <name>" + vbNewLine + _
sTemplateXML & " <language>" + vbNewLine + _
sTemplateXML & " <languageTerm authority='iso639-2b' type='code'>" + vbNewLine + _
sTemplateXML & " </languageTerm>" + vbNewLine + _
sTemplateXML & " </language>" + vbNewLine + _
sTemplateXML & " </name>" + vbNewLine + _
sTemplateXML & " </language>" + vbNewLine + _
sTemplateXML = sTemplateXML & "<abstract>" + vbNewLine
sTemplateXML = sTemplateXML & "</abstract>" + vbNewLine
sTemplateXML = sTemplateXML & "<subject>" + vbNewLine
sTemplateXML = sTemplateXML & " <topic>" + vbNewLine
sTemplateXML = sTemplateXML & " </topic>" + vbNewLine
sTemplateXML = sTemplateXML & " <topic>" + vbNewLine
sTemplateXML = sTemplateXML & " </topic>" + vbNewLine
sTemplateXML = sTemplateXML & " <topic>" + vbNewLine
sTemplateXML = sTemplateXML & " </topic>" + vbNewLine
sTemplateXML = sTemplateXML & " <topic>" + vbNewLine
sTemplateXML = sTemplateXML & " </topic>" + vbNewLine
sTemplateXML = sTemplateXML & " <topic>" + vbNewLine
sTemplateXML = sTemplateXML & " </topic>" + vbNewLine
sTemplateXML = sTemplateXML & " <topic>" + vbNewLine
sTemplateXML = sTemplateXML & " </topic>" + vbNewLine
sTemplateXML = sTemplateXML & " <topic>" + vbNewLine
sTemplateXML = sTemplateXML & " </topic>" + vbNewLine
sTemplateXML = sTemplateXML & " <topic>" + vbNewLine
sTemplateXML = sTemplateXML & " </topic>" + vbNewLine
sTemplateXML = sTemplateXML & " <topic>" + vbNewLine
sTemplateXML = sTemplateXML & " </topic>" + vbNewLine
sTemplateXML = sTemplateXML & " <geographic>" + vbNewLine
sTemplateXML = sTemplateXML & " </geographic>" + vbNewLine
sTemplateXML = sTemplateXML & " <geographic>" + vbNewLine
sTemplateXML = sTemplateXML & " </geographic>" + vbNewLine
sTemplateXML = sTemplateXML & " <geographic>" + vbNewLine
sTemplateXML = sTemplateXML & " </geographic>" + vbNewLine
sTemplateXML = sTemplateXML & " <temporal>" + vbNewLine
sTemplateXML = sTemplateXML & " </temporal>" + vbNewLine
sTemplateXML = sTemplateXML & "</subject>" + vbNewLine + _
sTemplateXML & " <relatedItem>" + vbNewLine + _
sTemplateXML & " <titleInfo>" + vbNewLine + _
sTemplateXML & " <title>" + vbNewLine + _
sTemplateXML & " </title>" + vbNewLine + _
sTemplateXML & " </titleInfo>" + vbNewLine + _
sTemplateXML & " <name type='personal'>" + vbNewLine + _
sTemplateXML & " <namePart>" + vbNewLine + _
sTemplateXML & " </namePart>" + vbNewLine + _
sTemplateXML & " <role>" + vbNewLine + _
sTemplateXML & " <roleTerm authority='marcrelator' type='text'>" + vbNewLine + _
sTemplateXML & " </roleTerm>" + vbNewLine + _
sTemplateXML & " </role>" + vbNewLine + _
sTemplateXML & " </name>" + vbNewLine + _
sTemplateXML & " <name type='personal'>" + vbNewLine + _
sTemplateXML & " <namePart>" + vbNewLine + _
sTemplateXML & " </namePart>" + vbNewLine + _
sTemplateXML & " <role>" + vbNewLine + _
sTemplateXML & " <roleTerm authority='marcrelator' type='text'>" + vbNewLine + _
sTemplateXML & " </roleTerm>" + vbNewLine + _
sTemplateXML & " </role>" + vbNewLine + _
sTemplateXML & " </name>" + vbNewLine + _
sTemplateXML = sTemplateXML & " <originInfo>" + vbNewLine
sTemplateXML = sTemplateXML & " <place>" + vbNewLine
sTemplateXML = sTemplateXML & " <placeTerm type='text'>" + vbNewLine
sTemplateXML = sTemplateXML & " </placeTerm>" + vbNewLine
sTemplateXML = sTemplateXML & " </place>" + vbNewLine
sTemplateXML = sTemplateXML & " <publisher>" + vbNewLine
sTemplateXML = sTemplateXML & " </publisher>" + vbNewLine
sTemplateXML = sTemplateXML & " <dateIssued>" + vbNewLine
sTemplateXML = sTemplateXML & " </dateIssued>" + vbNewLine
sTemplateXML = sTemplateXML & " <place>" + vbNewLine
sTemplateXML = sTemplateXML & " <placeTerm authority='marccountry' type='code'>" + vbNewLine
sTemplateXML = sTemplateXML & " </placeTerm>" + vbNewLine
sTemplateXML = sTemplateXML & " </place>" + vbNewLine
sTemplateXML = sTemplateXML & " </originInfo>" + vbNewLine + _
sTemplateXML & " <language>" + vbNewLine + _
sTemplateXML & " <language>" + vbNewLine + _
sTemplateXML & " <languageTerm authority='iso639-2b' type='code'>" + vbNewLine + _
sTemplateXML & " </languageTerm>" + vbNewLine + _
sTemplateXML & " </language>" + vbNewLine + _
sTemplateXML & " </language>" + vbNewLine + _
sTemplateXML = sTemplateXML & " <note>" + vbNewLine
sTemplateXML = sTemplateXML & " </note>" + vbNewLine
sTemplateXML = sTemplateXML & " <physicalDescription>" + vbNewLine
sTemplateXML = sTemplateXML & " <extent>" + vbNewLine
sTemplateXML = sTemplateXML & " </extent>" + vbNewLine
sTemplateXML = sTemplateXML & " </physicalDescription>" + vbNewLine
sTemplateXML = sTemplateXML & " <location>" + vbNewLine
sTemplateXML = sTemplateXML & " <physicalLocation>" + vbNewLine
sTemplateXML = sTemplateXML & " </physicalLocation>" + vbNewLine
sTemplateXML = sTemplateXML & " </location>" + vbNewLine
sTemplateXML = sTemplateXML & "</relatedItem>" + vbNewLine + _
sTemplateXML & " </mods>"
Set doc = CreateObject("MSXML2.DOMDocument")
doc.async = False
doc.validateOnParse = False
doc.resolveExternals = False
With ActiveWorkbook.Worksheets(1)
lLastRow = .UsedRange.Rows.Count
For lRow = 2 To lLastRow
Dim sFile As String
Dim sTitle As String
Dim sTitleInfo As String
Dim sNamePart As String
Dim sRoleTerm As String
Dim sNamePart2 As String
Dim sRoleTerm2 As String
sFile = "C:\Users\Duck\Documents\Batch Ingest\XML\" & Cells(lRow, 1).Value & ".xml"
sTitle = .Cells(lRow, 2).Text
sTitleInfo = .Cells(lRow, 3).Text
sNamePart = .Cells(lRow, 5).Text
sRoleTerm = .Cells(lRow, 6).Text
sNamePart2 = .Cells(lRow, 8).Text
sRoleTerm2 = .Cells(lRow, 9).Text
doc.LoadXML sTemplateXML
doc.getElementsByTagName("title")(0).appendChild doc.createTextNode(sTitle)
doc.getElementsByTagName("titleinfo")(0).appendChild doc.createTextNode(sTitleInfo)
doc.getElementsByTagName("namepart")(0).appendChild doc.createTextNode(sNamePart)
doc.getElementsByTagName("roleterm")(0).appendChild doc.createTextNode(sRoleTerm)
doc.getElementsByTagName("namepart")(0).appendChild doc.createTextNode(sNamePart2)
doc.getElementsByTagName("roleterm")(0).appendChild doc.createTextNode(sRoleTerm2)
doc.Save sFile
Next
End With
End Sub
我知道它可能不是最优雅的,但根据我所读的内容,它应该可以正确地用于超过25行的XML(对连续的“vbNewLine”常量的限制)
如果您能给我一些关于我犯了什么错误的指导,或者给我一些关于更好方法的建议,我将不胜感激。您的XML文档一开始就已损坏,因此找不到所需的标记,因此出现了错误。运行代码后,sTemplateXML变量的С内容:
False </note>
<physicalDescription>
<extent>
</extent>
</physicalDescription>
<location>
<physicalLocation>
</physicalLocation>
</location>
</relatedItem>
False </note>
<physicalDescription>
<extent>
</extent>
</physicalDescription>
<location>
<physicalLocation>
</physicalLocation>
</location>
</mods>
生成sTemplateXML期间出错的原因之一是不正确的换行符,例如,在第9行和第10行:
sTemplateXML = _
"<?xml version='1.0'?>" + vbNewLine + _
"<mods xmlns='http://www.loc.gov/mods/v3' xmlns:mods='http://www.loc.gov/mods/v3' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xlink='http://www.w3.org/1999/xlink'>" + vbNewLine + _
sTemplateXML & " <titleInfo>" + vbNewLine + _
sTemplateXML & " <title>" + vbNewLine + _
sTemplateXML & " </title>" + vbNewLine + _
sTemplateXML & " </titleInfo>" + vbNewLine + _
sTemplateXML = sTemplateXML & "<titleInfo>" + vbNewLine
sTemplateXML=_
“”+vbNewLine+_
“”+vbNewLine+_
sTemplateXML&“+vbNewLine+_
sTemplateXML&“+vbNewLine+_
sTemplateXML&“+vbNewLine+_
sTemplateXML&“+vbNewLine+_
sTemplateXML=sTemplateXML&“”+vbNewLine
最后一行被解释为比较
…+\sTemplateXML=sTemplateXML&…
,并在输出中生成第一个False
;dr您分配给sTemplateXML
的字符串非常混乱,与您所说的25个代码行限制不符。第一步:检查字符串结果(例如,通过Debug.Print sTemplateXML
到VB编辑器的即时窗口)并编辑正确的分配(最好通过单独的函数调用)当出现sTemplateXML=sTemplateXML&…
时,您通过下划线\uuu
将多个新赋值添加到先前的代码行,而不是开始一个单独的代码行。整理模板后,下一个问题将是getElementsByTagName
由于名称空间而无法工作。有关详细信息,请参阅。
fn = FreeFile
Open "test.txt" For Output As #fn
Print #1, sTemplateXML
Close #fn
sTemplateXML = _
"<?xml version='1.0'?>" + vbNewLine + _
"<mods xmlns='http://www.loc.gov/mods/v3' xmlns:mods='http://www.loc.gov/mods/v3' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xlink='http://www.w3.org/1999/xlink'>" + vbNewLine + _
sTemplateXML & " <titleInfo>" + vbNewLine + _
sTemplateXML & " <title>" + vbNewLine + _
sTemplateXML & " </title>" + vbNewLine + _
sTemplateXML & " </titleInfo>" + vbNewLine + _
sTemplateXML = sTemplateXML & "<titleInfo>" + vbNewLine