Как я могу получить сырой XML из IXMLDOMNodeList в Microsoft Access? - PullRequest
0 голосов
/ 11 сентября 2009

Как извлечь необработанный текст в формате XML из MSXML2 - IXMLDOMNodeList в Microsoft Access?

Ответы [ 4 ]

1 голос
/ 11 сентября 2009

(Этот запрос был отправлен для меня прокси-сервером.) Требуются точные знания: взять объект MSXML2.IXMLDOMNodeList, возвращаемый API веб-службы, и извлечь данные из узлов. У меня есть кусок рабочего кода, который делает это для версии XML, но я не хочу становиться экспертом по MSXML только для того, чтобы заставить работать одну функцию. Вот версия, которая работает с вводом XML, как я могу изменить ее для работы с вводом nodeList? (Могу ли я также вывести список узлов в формате XML? Это поможет с остальными шагами.

(добавлен :) Я только что попробовал свойство .xml с узлами, и это фактически дает мне весь XML. По-видимому, API отправляет список узлов с одним узлом, и применение свойства .xml к этому узлу приводит к полному XML-документу (который я не могу понять, как отобразить здесь, XML обрабатывается в предварительном просмотре). (/ добавлено)

Private Sub ParseXML_Click()

Dim thisXML As MSXML2.DOMDocument
Dim fSuccess As Boolean
Dim oRoot     As MSXML2.IXMLDOMNode
Dim oBooking  As MSXML2.IXMLDOMNode
Dim oChildren As MSXML2.IXMLDOMNodeList
Dim oChild    As MSXML2.IXMLDOMNode
Dim theDB As Database
Dim theRST As Recordset

Set theDB = CurrentDb
Set theRST = theDB.OpenRecordset("XMLBookings", dbOpenDynaset)

Set thisXML = New MSXML2.DOMDocument
thisXML.async = False
thisXML.validateOnParse = False
fSuccess = thisXML.LoadXml(Bookings_fld)
 ' If anything went wrong, quit now.
If NotfSuccess Then
  GoTo ExitHere
End If

Set oRoot = thisXML.documentElement
For Each oBooking In oRoot.childNodes
    theRST.AddNew
    Set oChildren = oBooking.childNodes
    For Each oChild In oChildren
        Select Case oChild.nodeName
        Case "EventName"
'            MsgBox "EventName = " & oChild.nodeTypedValue
            theRST!EventName = oChild.nodeTypedValue
        Case 
        (etc)

        End Select
    Next oChild
        theRST.Update                         ' Save changes.
Next oBooking

MsgBox "Done!"
theRST.Close
Set theDB = Nothing

ExitHere:
        Exit Sub
HandleErr:
        MsgBox "Error " & Err.Number & ": " & Err.Description
        Resume ExitHere
        Resume

End Sub
1 голос
/ 11 сентября 2009

Вы можете использовать свойство Xml для каждого IXmlDomNode.

0 голосов
/ 12 сентября 2009

Это действительно зависит от того, что вы планируете делать с XML. В Access 2003 и 2007 мы можем импортировать XML.

Итак, если у вас есть строка xml, представляющая собой таблицу данных, вы можете получить данные, записать их на диск и затем выполнить Application.ImportXML. Этот подход намного меньше кода, чем другие ответы, приведенные здесь.

Вот код, отсекающий эту концепцию:

Dim intF       As Integer
Dim strF       As String
Dim objXML     As Object

Set objXML = CreateObject("MSXML2.XMLHTTP")
objXML.Open "GET", "URL string here", False
objXML.Send

strF = "c:\t.xml"
intF = FreeFile
Open strF For Output As intF
Write #intF, objXML.responsetext
Close

Application.ImportXML "c:\t.xml", acAppendData

Вышеприведенное предполагает, что у XML есть каталог или таблица def в тексте

например:

<CATALOG>
<tblContacts>
<ID>1</ID>
<Last_x0020_Name>Kallal</Last_x0020_Name>
<First_x0020_Name>Albert</First_x0020_Name>
</tblContacts>
<tblContacts>
<ID>2</ID>
<Last_x0020_Name>Smo</Last_x0020_Name>
<First_x0020_Name>Joe</First_x0020_Name>
</tblContacts>
</CATALOG>
0 голосов
/ 11 сентября 2009

Вы сделаете это с VBA.

Добавьте соответствующую msxml dll к своим инструментам

напишите такой код, как этот:

Public Function getFromXML(x_fileXML as string) as string

On Error GoTo ERREUR

      Dim doc_xml As MSXML2.DOMDocument, _
          list_xml As IXMLDOMNodeList, _ 
          i As Long, _
          m_getFromXML as string


Set doc_xml = New MSXML2.DOMDocument

doc_xml.Load x_fileXML

'i am interested by the nodeLists having a "attributeType: tag"'
Set list_xml = doc_xml.getElementsByTagName("s:AttributeType")
For i = 0 To (list_xml.Length - 1)
     'extract the requested data here'
     'something like m_getFromXML = m_getFromXML & ";" & ...'
Next i

getFromXML = m_getFromXML

Это было написано на лету. Пожалуйста, проверьте объекты, которые должны быть закрыты / не установлены, перед тем как выйти из процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...