Получение информации из документа XML в VBA - PullRequest
0 голосов
/ 09 сентября 2010

Я использую MSXML2 для загрузки XML-файла (канал из Google Analytics).

Теперь мне нужно извлечь из него данные, но я не могу понять, как.

Это XML:

<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:dxp='http://schemas.google.com/analytics/2009' xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"dsdsdsdsdsdsdsd."' gd:kind='analytics#data'>
  <id>http://www.google.com/analytics/feeds/data?ids=ga:2000000&amp;dimensions=ga:campaign&amp;metrics=ga:visits&amp;filters=ga:campaign%3D%3Dcrosspromo&amp;start-date=2010-08-26&amp;end-date=2010-09-09</id>
  <updated>2010-09-09T05:50:40.705-07:00</updated>
  <title>Google Analytics Data for Profile 2000000</title>
  <link rel='self' type='application/atom+xml' href='https://www.google.com/analytics/feeds/data?max-results=50&amp;end-date=2010-09-09&amp;start-date=2010-08-26&amp;metrics=ga%3Avisits&amp;ids=ga%3A2000000&amp;dimensions=ga%3Acampaign&amp;filters=ga%3Acampaign%3D%3Dcrosspromo' />
  <author>
    <name>Google Analytics</name>
  </author>
  <generator version='1.0'>Google Analytics</generator>
  <openSearch:totalResults>1&lt;
  /openSearch:totalResults&gt;
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>50</openSearch:itemsPerPage>
  <dxp:aggregates>
    <dxp:metric confidenceInterval='0.0' name='ga:visits' type='integer' value='5070' />
  </dxp:aggregates>
  <dxp:dataSource>
    <dxp:property name='ga:profileId' value='2000000' />
    <dxp:property name='ga:webPropertyId' value='UA-2000000-1' />
    <dxp:property name='ga:accountName' value='test' />
    <dxp:tableId>ga:2000000</dxp:tableId>
    <dxp:tableName>test</dxp:tableName>
  </dxp:dataSource>
  <dxp:endDate>2010-09-09</dxp:endDate>
  <dxp:startDate>2010-08-26</dxp:startDate>
  <entry gd:etag='W/"CkMEQX47eSp7I2A9Wx5QGUQ."' gd:kind='analytics#datarow'>
    <id>http://www.google.com/analytics/feeds/data?ids=ga:2000000&amp;ga:campaign=crosspromo&amp;filters=ga:campaign%3D%3Dcrosspromo&amp;start-date=2010-08-26&amp;end-date=2010-09-09</id>
    <updated>2010-09-08T17:00:00.001-07:00</updated>
    <title>ga:campaign=crosspromo</title>
    <link rel='alternate' type='text/html' href='http://www.google.com/analytics' />
    <dxp:dimension name='ga:campaign' value='crosspromo' />
    <dxp:metric confidenceInterval='0.0' name='ga:visits' type='integer' value='5070' />
  </entry></openSearch:totalResults>
</feed>

Затем я загружаю XML и ищу тег "entry":

Dim objXML As MSXML2.DOMDocument
Set objXML = New MSXML2.DOMDocument
objXML.loadXML strXML
Debug.Print objXML.getElementsByTagName("entry").Item(0).Text

Но это выводит:

http://www.google.com/analytics/feeds/data?ids=ga:20000000&ga:campaign=crosspromo&filters=ga:campaign%3D%3Dcrosspromo&start-date=2010-08-26&end-date=2010-09-092010-09-08T17:00:00.001-07:00ga:campaign=crosspromo

Где остальные данные?Если я попробую пункт (1), он потерпит неудачу ...

Ответы [ 3 ]

4 голосов
/ 11 сентября 2010

Попробуйте:

Option Explicit

Public Function LoadXmlDoc() As DOMDocument
    Dim aDoc As DOMDocument
    Set aDoc = New DOMDocument
    aDoc.async = False
    aDoc.Load ("feedfile.xml")
    Set LoadXmlDoc = aDoc
End Function

'' Direct access
Public Sub getEntry()
    Dim aDoc As DOMDocument
    Dim aNode As IXMLDOMNode
    Set aDoc = LoadXmlDoc
    Set aNode = aDoc.SelectSingleNode("//entry")
    Debug.Print aNode.XML
End Sub

'' search for it
Public Sub findEntry()
    Dim aDoc As DOMDocument
    Dim aNode As IXMLDOMNode
    Dim aNodes As IXMLDOMNodeList
    Set aDoc = LoadXmlDoc
    Set aNodes = aDoc.getElementsByTagName("entry")
    For Each aNode In aNodes
        Debug.Print aNode.XML
    Next
End Sub

'' get the entry date
Public Sub getDate()
    Dim aDoc As DOMDocument
    Dim aNode As IXMLDOMNode
    Set aDoc = LoadXmlDoc
    Set aNode = aDoc.SelectSingleNode("//entry/updated")
    Debug.Print aNode.Text
End Sub
4 голосов
/ 09 сентября 2010

Well Item (1) завершается ошибкой, потому что есть только один элемент "entry", и он равен 0.

Свойство .Text возвращает все текстовое содержимое элемента и всех его дочерних элементов .Если вы присмотритесь, это то, что у вас есть.

Если вы хотите что-то еще, вам придется использовать соответствующий метод из Item (0).

Проверить этот вопрос( Как анализировать XML в VBA ).

0 голосов
/ 09 сентября 2010

Вы получили всю запрашиваемую информацию.Вы получили текст каждого элемента в пределах <entry></entry>

, давайте разбить его (это был ваш вывод):

Первый набор текста:

http://www.google.com/analytics/feeds/data?ids=ga:20000000&ga:campaign=crosspromo&filters=ga:campaign%3D%3Dcrosspromo&start-date=2010-08-26&end-date=2010-09-09

ВторойНабор текста:

2010-09-08T17:00:00.001-07:00

Третий набор текста:

ga:campaign=crosspromo

В записи с выводом больше ничего не было.Поэтому вы больше ничего не видите.

...