Как объединить два XML-файла в классическом ASP? - PullRequest
4 голосов
/ 24 марта 2010

Я использую классический 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 голосов
/ 24 марта 2010

В продолжение ответа Йорна Шоу-Роде:

<%
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>","") )

%>

Это заменит тег из doc1.xml на doc2.xml без первых двух строк, но, опять же, будет работать только в той ситуации, когда у вас есть эти два XML-файла, и они не содержат повторяющихся узлов.

Вы можете читать файлы при использовании FileSystemObject, что будет быстрее, но преимущество загрузки его в DOM состоит в том, что он будет загружать только правильно сформированный xml.

0 голосов
/ 24 марта 2010

Ваш базовый подход должен работать. Я подозреваю, что один из ваших документов не загружается правильно, потому что он неправильно сформирован или содержит ошибку кодирования. Пожалуйста, проверьте, что дает вам эта модификация:

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
0 голосов
/ 24 марта 2010

Отказ от ответственности: Этот ответ содержит «гетто» решение рассматриваемой проблемы.Хотя он должен работать просто отлично для этой конкретной проблемы, он не решит любую проблему, связанную с XML.

Учитывая, что вам просто нужно объединить узлы прямо под узлом документав двух документах решение этого вопроса должно быть тривиальным с помощью простых манипуляций со строками, без анализа самого XML.Просто чтобы понять:

  1. Прочитать все строки , кроме последней из 01.xml, и записать их в выходной поток.
  2. Читать все строки кроме первых двух из 02.xml и записи их в выходной поток.

Мой 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
...