Форум программистов, компьютерный форум, киберфорум
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.97/32: Рейтинг темы: голосов - 32, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 24.09.2010
Сообщений: 70
1

Парсинг XML при помощи Microsoft.XMLDOM

29.11.2006, 20:13. Показов 6519. Ответов 11
Метки нет (Все метки)

Взял пример кода с этого сайта:
Код
Set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.Load("http://nikolaev.promir.info/rss/foto_nikolaev_day.xml my_xml.xml")
If xmlDoc.parseError.errorCode <> 0 Then
  Response.Write("Error")
else
 ' Документ загружен успешно 
 For i = 0 To xmlDoc.documentElement.ChildNodes.Length - 1
  Response.Write(xmlDoc.documentElement.ChildNodes(i).NodeName)
  Response.Write("=")
  Response.Write(xmlDoc.documentElement.ChildNodes(i).NodeValue)
  Response.Write("
" & vbCrLf)
 next
End If
В строке <STRONG>For i = 0 To xmlDoc.documentElement.ChildNodes.Length - 1</STRONG> сервер пишет ошибку:
Microsoft VBScript runtime error '800a01a8'
Object required: '[object]'
/my_import.asp, line 28
Я так понимаю, что объект <STRONG>xmlDoc.documentElement </STRONG>= NULL. Но почему?
Помогите, пожалуйста, разобраться - в чем дело?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2006, 20:13
Ответы с готовыми решениями:

Не получается сохранение xml-файла через CreateObject("Microsoft.XMLDOM")
&lt;code&gt;&lt;HTML&gt; &lt;HEAD&gt; &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251 ...

ошибка в Microsoft.XMLDom.selectSingleNode?
что возвращает метод selectSingleNode, если ни один из узлов не соответствует запросу? В...

Как при помощи средств XmlWriter создать файл XML
как при помощи средств XmlWriter создать подобный файл &lt;rdf:RDF xmlns:xsi=&quot;http&quot; xmlns:rdf=&quot;&quot;&gt;...

Нужно вставить результат обработки xml-страницы с данными при помощи xsl в страницу
Задача состоит в том, чтобы вставить результат обработки xml-страницы с данными при помощи xsl в...

11
80 / 56 / 68
Регистрация: 15.03.2007
Сообщений: 6,908
29.11.2006, 20:19 2
Попробуй перед xmlDoc.load() поставить строку xmlDoc.async = False
0
0 / 0 / 0
Регистрация: 24.09.2010
Сообщений: 70
29.11.2006, 20:32  [ТС] 3
О, а теперь документ не грузится... :-(
Т.е. срабатывает ветка <STRONG>xmlDoc.parseError.errorCode <> 0</STRONG>
0
0 / 0 / 0
Регистрация: 24.09.2010
Сообщений: 70
29.11.2006, 20:55  [ТС] 4
Целый день стучал бубном, пробовал все в разной комбинации. И вот, если к приведенному коду добавить <STRONG>xmlDoc.resolveExternals = False</STRONG>, то код работает.
Нус... Посмотрим что дальше :-)
0
80 / 56 / 68
Регистрация: 15.03.2007
Сообщений: 6,908
29.11.2006, 21:01 5
Разбирайся что за конкретно ошибка просходит. Понять это можно из свойств объекта http://msdn2.microsoft.com/en-us/library/ms767720.aspx parseError. Выведи их на экран Response.Write-ом.
P.S. Пока печатал ответ, ты сам написал про свойство resolveExternals. В любом случае знать про вывод текста ошибки тебе не помешает.
0
0 / 0 / 0
Регистрация: 24.09.2010
Сообщений: 70
29.11.2006, 21:27  [ТС] 6
Спасибо за совет. Тем более, что он мне уже пригодился. Один xml у меня грузится без ошибки. Другой - не грузится. Вот этот, например, не грузится: http://www.ukrindustrial.com/rss/news_all_cp1251.xml http://www.ukrindustrial.com/rss/news_all_cp1251.xml
Код ошибки система выводит: -2146697209
Описание ошибки: Для запрошенного ресурса данные недоступны (No data is available for the requested resource)
Это я опять что-то не учел?
0
0 / 0 / 0
Регистрация: 24.09.2010
Сообщений: 70
29.11.2006, 21:46  [ТС] 7
Извиняюсь за свою торопливость. Надеюсь, что этот пост будет полезен многим.
Добавление вот этой строки решило проблему:
<STRONG>xmlDoc.setProperty "ServerHTTPRequest", true</STRONG>
0
80 / 56 / 68
Регистрация: 15.03.2007
Сообщений: 6,908
29.11.2006, 21:49 8
Отлично.
0
0 / 0 / 0
Регистрация: 24.09.2010
Сообщений: 70
30.11.2006, 13:47  [ТС] 9
Ниже я привожу полностью рабочий кусок кода для парсинга уже упомянутого канала. Заодно было бы здорово услышать критику, если в этом коде что-то не так.
Код работает. Опробован на разных каналах.
Код
Set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.setProperty "ServerHTTPRequest", true
' Загружаем документ
xmlDoc.Load("http://www.ukrindustrial.com/rss/news_all_cp1251.xml http://www.ukrindustrial.com/rss/news_all_cp1251.xml")
If xmlDoc.parseError.errorCode <> 0 Then
 ' Если документ не загружен 
 Response.Write("Error: " & xmlDoc.parseError.reason & "
Код ошибки: " & xmlDoc.parseError.errorCode)
else
 ' Документ загружен успешно 
 ' Получаем объект - список элементов "item"
 Set objItemList = xmlDoc.getElementsByTagName("item")
 ' Цикл по списку элементов
 For i = 0 To objItemList.Length - 1
  ' Получаем объект - очередной элемент "item" из списка objItemList 
  Set objItem = objItemList.item(i)
  ' Получаем объект - элемент "title" текущего элемента "item"
  Set objTitle = objItem.getElementsByTagName("title")
  ' Получаем объект - элемент "description" текущего элемента "item"
  Set objDescription = objItem.getElementsByTagName("description")
  
  ' Выводим текст элементов
  Response.Write("<h3>" & objTitle.item(0).text & "</h3>")
  Response.Write("<p>" & objDescription.item(0).text & "</p>")
 next
End If
0
80 / 56 / 68
Регистрация: 15.03.2007
Сообщений: 6,908
30.11.2006, 14:53 10
Не уверен что стоит выводить настоящую причину ошибки. Я бы выводил сообщение вида "ошибка загрузки XML файла". Настоящий текст ошибки ведь нужен только тебе, пользователю он скорее всего ничего не скажет.
Наколько я понимаю ты выводишь содержимое RSS ленты со своим оформлением. Более красиов это можно решить через XSL преобразование. Такое решение проще будет поддерживать. Код ASP всегда будет один и тот же, а внешний вид можно полностью на XSL контроллировать.
0
0 / 0 / 0
Регистрация: 24.09.2010
Сообщений: 70
30.11.2006, 15:27  [ТС] 11
Да, верно. Оформление я сам делаю. За советы - спасибо.
Меня еще беспокоила инициализация объектов в цикле, т.е. строка типа <STRONG>Set objItem = ...</STRONG> . Не будет ли утечки памяти? Может быть в конце каждой итерации нужно писать что-то типа <STRONG>Set objItem = nothing</STRONG>?
0
80 / 56 / 68
Регистрация: 15.03.2007
Сообщений: 6,908
30.11.2006, 15:56 12
Утечки памяти точно не будет. Присваивать переменной значение Nothing нет необходимости.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2006, 15:56

Парсинг xml
Всем привет, подскажите пожалуйста как спарсить следующий фрагменты xml файла ...

Парсинг XML
Допустим есть следующая XMLNodeCollection (по сути List&lt;XmlElement&gt;): &lt;cat level=&quot;2&quot;...

xml парсинг
пишу рсс-ридер, и пытаюсь как-нить разобрать пришедший рсс файл. в следующем коде, например, я...

Полный парсинг Xml на c#
Есть книга в формате fb2 - &lt;FictionBook xmlns=&quot;http://www.gribuser.ru/xml/fictionbook/2.0&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.