如何在经典ASP中合并两个XML文件?

时间:2010-03-24 09:42:04

标签: xml xslt asp-classic vbscript

我在项目中使用经典ASP。我想将两个XML合并在一起。我该怎么做呢?以下是我的示例代码:

XML 1

<CATALOG>
<CD>
  <TITLE>1</TITLE> 
  <ARTIST>Bob Dylan</ARTIST> 
  <COUNTRY>USA</COUNTRY> 
  <COMPANY>Columbia</COMPANY> 
  <PRICE>10.90</PRICE> 
  <YEAR>1985</YEAR> 
</CD>
<CD>
  <TITLE>2</TITLE> 
  <ARTIST>Bonnie Tyler</ARTIST> 
  <COUNTRY>UK</COUNTRY> 
  <COMPANY>CBS Records</COMPANY> 
  <PRICE>9.90</PRICE> 
  <YEAR>1988</YEAR> 
</CD>
<CD>
  <TITLE>3</TITLE> 
  <ARTIST>Dolly Parton</ARTIST> 
  <COUNTRY>USA</COUNTRY> 
  <COMPANY>RCA</COMPANY> 
  <PRICE>9.90</PRICE> 
  <YEAR>1982</YEAR> 
</CD>
</CATALOG>

XML2

<CATALOG>
<CD>
  <TITLE>4</TITLE> 
  <ARTIST>Gary Moore</ARTIST> 
  <COUNTRY>UK</COUNTRY> 
  <COMPANY>Virgin records</COMPANY> 
  <PRICE>10.20</PRICE> 
  <YEAR>1990</YEAR> 
</CD>
<CD>
  <TITLE>5</TITLE> 
  <ARTIST>Eros Ramazzotti</ARTIST> 
  <COUNTRY>EU</COUNTRY> 
  <COMPANY>BMG</COMPANY> 
  <PRICE>9.90</PRICE> 
  <YEAR>1997</YEAR> 
</CD>
<CD>
  <TITLE>6</TITLE> 
  <ARTIST>Bee Gees</ARTIST> 
  <COUNTRY>UK</COUNTRY> 
  <COMPANY>Polydor</COMPANY> 
  <PRICE>10.90</PRICE> 
  <YEAR>1998</YEAR> 
</CD>
</CATALOG>

这是我目前使用的ASP代码:

Dim doc1      ''# As MSXML2.DOMDocument30
Dim doc2      ''# As MSXML2.DOMDocument30
Dim doc2Node  ''# As MSXML2.IXMLDOMNode

Set doc1 = createobject("MSXML2.DOMDocument.3.0")
Set doc2 = createobject("MSXML2.DOMDocument.3.0")

doc1.Load "01.xml"
doc2.Load "02.xml"

For Each doc2Node In doc2.documentElement.childNodes 
 doc1.documentElement.appendChild doc2Node
Next

response.write  doc1.xml

但现在我收到了一个错误:

Microsoft VBScript runtime error '800a01a8' 

Object required: 'documentElement'

3 个答案:

答案 0 :(得分:0)

免责声明:此答案包含有关问题的“贫民窟”解决方案。虽然它对于这个特定问题应该可以正常工作,但解决任何与XML相关的问题。

考虑到您只需要在两个文档中的文档节点正下方连接节点,使用简单的字符串操作来解决问题应该是微不足道的,而不需要解析实际的XML。只是为了得到这个想法:

  1. 01.xml读取除最后一行之外的所有行,并将它们写入输出流。
  2. 02.xml读取除前两个之外的所有行,并将它们写入输出流。
  3. 我的VBScript非常生疏,但我相信这样的东西会削减它:

    Const ForReading = 1
    
    Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
    Set textStream = objFSO.OpenTextFile(Server.MapPath("01.xml"), ForReading)
    lastLine = ""
    
    Do While Not textStream.AtEndOfStream
        Response.Write lastLine 
        lastLine = TextStream.readline
    Loop
    
    Set textStream = objFSO.OpenTextFile(Server.MapPath("02.xml"), ForReading)
    
    counter = 0
    
    Do While Not textStream.AtEndOfStream
        counter = counter + 1
        If counter > 2 Then
            Response.Write TextStream.readline
        End If
    Loop
    

答案 1 :(得分:0)

扩展JørnSchou-Rode的回答:

<%
Dim doc1    'As MSXML2.DOMDocument30
Dim doc2    'As MSXML2.DOMDocument30
Dim doc2Node    'As MSXML2.IXMLDOMNode

Set doc1 = createobject("MSXML2.DOMDocument.3.0")
Set doc2 = createobject("MSXML2.DOMDocument.3.0")

doc1.Load "01.xml"
doc2.Load "02.xml"

Response.Write ( doc1.xml.Replace("</CATALOG>", doc2.xml.Replace( "<?xml version="1.0" encoding="ISO-8859-1" ?>","").Replace("<CATALOG>","") )

%>

这将使用没有前两行的doc2.xml替换doc1.xml中的标记,但同样,只适用于这种情况,即您拥有这两个xml文件并且它们不包含重复的节点。

你可以使用FileSystemObject读取文件,这会更快,但是在DOM中加载它的好处是它只能加载格式良好的xml。

答案 2 :(得分:0)

您的基本方法应该有效。我怀疑你的一个文档没有正确加载,因为它没有格式良好或有编码错误。请检查此修改为您提供的内容:

Set doc1 = LoadXml("01.xml", True)
Set doc2 = LoadXml("02.xml", True)

''# ... all the rest of your stuff ...

Function LoadXml(XmlPath, FailOnError)
  Dim xml, e

  Set xml = Server.CreateObject("MSXML2.DOMDocument.3.0")
  xml.Load XmlPath

  Set e = xml.parseError
  If e.errorCode <> 0 Then
    DebugPrint "XML parsing error " & e.errorCode
    DebugPrint "in file "  & e.url
    DebugPrint "on line: " & e.line & ", pos: " & e.linePos
    DebugPrint "reason: "  & e.reason
    DebugPrint "source: "  & e.srcText
    If FailOnError Then Response.End
  End If  

  Set LoadXml = xml
End Function

Sub DebugPrint(s)
  Response.Write Server.HTMLEncode(s) & "<br>"
End Sub