1

Тема: VBScript: работа с XML с помощью компонента Chilkat XML

Бесплатный COM-сервер Chilkat XML предоставляет простой и удобный функционал для работы с XML. Дистрибутив (msi-инсталлятор) имеет размер порядка 1,1 Мб. Документацию можно найти здесь. Примеры можно найти здесь.

См. также MS XML Parser.

Основные возможности Chilkat XML:
* доступ к XML с помощью объектной модели документов (DOM), многочисленные методы обхода документа; поиск и сортировка узлов; добавление атрибутов и их значений к узлам;
* zip-сжатие узлов и поддеревьев в памяти;
* AES-шифрование содержимого узла;
* обработка двоичных данных (таких, как изображения) в пределах файлов XML.

Образцовый XML-файл для примера:

<CURRENCIES>
<LAST_UPDATE>2007-06-11</LAST_UPDATE>

<CURRENCY>
<NAME>Dollar</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>USD</CURRENCYCODE>
<COUNTRY>USA</COUNTRY>
<RATE>4.187</RATE>
<CHANGE>-0.238</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Pound</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>GBP</CURRENCYCODE>
<COUNTRY>Great Britain</COUNTRY>
<RATE>8.2356</RATE>
<CHANGE>-0.426</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Yen</NAME>
<UNIT>100</UNIT>
<CURRENCYCODE>JPY</CURRENCYCODE>
<COUNTRY>Japan</COUNTRY>
<RATE>3.4401</RATE>
<CHANGE>-0.784</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Euro</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>EUR</CURRENCYCODE>
<COUNTRY>EMU</COUNTRY>
<RATE>5.5892</RATE>
<CHANGE>-0.599</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Dollar</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>AUD</CURRENCYCODE>
<COUNTRY>Australia</COUNTRY>
<RATE>3.5288</RATE>
<CHANGE>-0.096</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Dollar</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>CAD</CURRENCYCODE>
<COUNTRY>Canada</COUNTRY>
<RATE>3.9405</RATE>
<CHANGE>-0.139</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>krone</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>DKK</CURRENCYCODE>
<COUNTRY>Denmark</COUNTRY>
<RATE>0.7508</RATE>
<CHANGE>-0.583</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Krone</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>NOK</CURRENCYCODE>
<COUNTRY>Norway</COUNTRY>
<RATE>0.6883</RATE>
<CHANGE>-1.078</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Rand</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>ZAR</CURRENCYCODE>
<COUNTRY>South Africa</COUNTRY>
<RATE>0.5764</RATE>
<CHANGE>0.017</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Krona</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>SEK</CURRENCYCODE>
<COUNTRY>Sweden</COUNTRY>
<RATE>0.5988</RATE>
<CHANGE>-0.499</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Franc</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>CHF</CURRENCYCODE>
<COUNTRY>Switzerland</COUNTRY>
<RATE>3.3807</RATE>
<CHANGE>-1.068</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Dinar</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>JOD</CURRENCYCODE>
<COUNTRY>Jordan</COUNTRY>
<RATE>5.9088</RATE>
<CHANGE>-0.253</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Pound</NAME>
<UNIT>10</UNIT>
<CURRENCYCODE>LBP</CURRENCYCODE>
<COUNTRY>Lebanon</COUNTRY>
<RATE>0.0278</RATE>
<CHANGE>0</CHANGE>
</CURRENCY>

<CURRENCY>
<NAME>Pound</NAME>
<UNIT>1</UNIT>
<CURRENCYCODE>EGP</CURRENCYCODE>
<COUNTRY>Egypt</COUNTRY>
<RATE>0.7357</RATE>
<CHANGE>-0.258</CHANGE>
</CURRENCY>
</CURRENCIES>

Форматирование XML с отступами:

Set oXml = CreateObject("Chilkat.Xml")
oXml.LoadXml "<root><company><name>Chilkat Software, Inc.</name><url>http://www.chilkatsoft.com/</url><phone>630-784-9670</phone></company></root>"
WScript.Echo oXml.GetXml()

Поиск и чтение нужных узлов:

Set oXml_ = CreateObject("Chilkat.Xml")
'oXml_.LoadXmlFile("c:\temp\test.xml")
Set oXml = oXml_.HttpGet("http://www.chilkatsoft.com/testData/currency.xml")
For i = 0 To oXml.NumChildrenHavingTag("CURRENCY") - 1 ' количество узлов "CURRENCY"
    Set curr = oXml.GetNthChildWithTag("CURRENCY", i) ' получить n-ный узел "CURRENCY"
    WScript.Echo "----"
    WScript.Echo "Name: " & curr.GetChildContent("NAME") ' содержимое дочернего узла
    WScript.Echo "Code: " & curr.GetChildContent("CURRENCYCODE")
    WScript.Echo "Country: " & curr.GetChildContent("COUNTRY")
Next

Создание узлов и атрибутов:

Set oXml = CreateObject("Chilkat.Xml")
oXml.Tag = "root"
Set xNode0 = oXml.NewChild("products", "")

Set xChild = xNode0.NewChild("one", "content of node")
xChild.AddAttribute "price", "0.99"

Set xChild = xNode0.NewChild("two", "")
xChild.AddAttribute "price", "10.99"

WSCript.Echo oXml.GetXml()

Ещё один способ обхода документа:

Set oXml = CreateObject("Chilkat.Xml")
oXml.LoadXmlFile "C:\Temp\test.xml"
Set oNode = oXml.FirstChild()
Do While Not (oNode Is Nothing )
    WScript.Echo oNode.GetChildContent("NAME")
    Set oNode = oNode.NextSibling()
Loop
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: VBScript: работа с XML с помощью компонента Chilkat XML

Сжатие и шифрование узлов:

Set oXml = CreateObject("Chilkat.Xml")
oXml.Tag = "root"
Set xmlM = oXml.NewChild("catalog", "")
xmlM.NewChild2 "one", "string"
xmlM.NewChild2 "two", "34.50"
Set xmlG = oXml.NewChild("list", "")
xmlG.NewChild2 "one", "str"
xmlG.NewChild2 "two", "34.00"

xmlM.ZipTree()
xmlM.EncryptContent "secretPassword"
WScript.Echo oXml.GetXml()
xmlM.DecryptContent "secretPassword"
suc = xmlM.UnzipTree()

WScript.Echo oXml.GetXml()

Работа с бинарными данными в XML. Пример ниже загружает бинарный файл C:\Temp\test.jpg, помещает его в XML-документ в формате Base64, а затем извлекает из XML-документа и сохраняет на диск как C:\Temp\test1.jpg. Используется объект "Chilkat.CkData", который есть в поставке компонента Chilkat XML:

Set oData = CreateObject("Chilkat.CkData")
oData.LoadFile "C:\Temp\test.jpg"
data = oData.GetBinary()
Set oXml = CreateObject("Chilkat.Xml")
oXml.Tag = "root"
zipFlag = 0 ' не сжимать
encryptFlag = 0 ' не шифровать
password = "NotUsed"
oXml.SetBinaryContent data, zipFlag, encryptFlag, password
'Wscript.Echo oXml.GetXml()
oXml.SaveBinaryContent "C:\Temp\test1.jpg", zipFlag, encryptFlag, password

Можно обойтись и без объекта "Chilkat.CkData":

Set oXml = CreateObject("Chilkat.Xml")
oXml.Tag = "root"
zipFlag = 0 ' не сжимать
encryptFlag = 0 ' не шифровать
password = "NotUsed"
oXml.SetBinaryContentFromFile "C:\Temp\test.jpg", zipFlag, encryptFlag, password
Wscript.Echo oXml.GetXml()
oXml.SaveBinaryContent "C:\Temp\test1.jpg", zipFlag, encryptFlag, password
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: VBScript: работа с XML с помощью компонента Chilkat XML

Вместе с Chilkat XML поставляется COM-сервер Chilkat Rss для обработки RSS лент, документацию по которому можно найти здесь.

Пример загрузки и обхода RSS ленты:

Set oRss = CreateObject("Chilkat.Rss")
suc = oRss.DownloadRss("http://feeds2.feedburner.com/simple-recepty")
If suc <> 1 Then
    Wscript.Echo oRss.LastErrorText
    WScript.Quit()
End If
Set oChannel = oRss.GetChannel(0)
If oChannel Is Nothing Then
    Wscript.Echo "Нет каналов."
    WScript.Quit()
End If
' Информация о ленте:
Wscript.Echo oChannel.GetString("title")
Wscript.Echo oChannel.GetString("link")
Wscript.Echo oChannel.GetString("description")
Wscript.Echo
' Обход ленты:
For i = 0 To oChannel.numItems - 1
    Set oItem = oChannel.GetItem(i)
    ' Информация об элементе:
    ttl = oItem.GetString("title")
    lnk = oItem.GetString("link")
    dat = oItem.GetString("pubDate")
    
    cats = "" ' категории элемента
    For j = 0 To oItem.GetCount("category") - 1
        cats = cats & oItem.MGetString("category", j) & " "
    Next
    
    Wscript.Echo ttl & " (" & lnk & ") " & dat & " (" & cats & ")"
Next
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.