Страница 1 из 1

Ссылка на неопределенный объект

СообщениеДобавлено: 13.04.2007 (Пт) 11:38
Antonariy
Почему при выполнении
Код: Выделить всё
Dim doc As New DOMDocument
doc.loadXML "<root>&nbsp;</root>"
в doc.parseError появляется ошибка "Ссылка на неопределенный объект ''nbsp''"? Как его определить, чтобы такой текст загружался?

СообщениеДобавлено: 13.04.2007 (Пт) 11:41
Konst_One
DTD или прям в сам xml внедри описание или укажи схему xmlns

СообщениеДобавлено: 13.04.2007 (Пт) 11:53
Antonariy
Как выглядит описание? Вернее как будет выглядеть мой пример с описанием объекта (раньше в дебри xml залезать не приходилось :oops: )? Или как он будет выглядеть с подходящей схемой? Вернее нужен пример и того и другого.

Вообще мне это нужно для процедуры, превращающей кривой-косой html в чистенький xml.

СообщениеДобавлено: 13.04.2007 (Пт) 12:10
tyomitch

СообщениеДобавлено: 13.04.2007 (Пт) 12:49
Antonariy
С htmlent.dtd и как объявлять объекты разобрался, а как внедрить описание в сам xml? На текст
Код: Выделить всё
<!ENTITY nbsp "& #32;"><root>&nbsp;</root>
ругается словами "Не допускается обявление DTD вне DTD".

СообщениеДобавлено: 13.04.2007 (Пт) 12:52
tyomitch
Наверное, надо <!DOCTYPE> снаружи?

СообщениеДобавлено: 13.04.2007 (Пт) 13:07
Antonariy
Наверное? Не знаю. Почему и спрашиваю.
Код: Выделить всё
<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"" /><!ENTITY nbsp ""& #32;""><root>&nbsp;</root>
дает ошибку "требуется строковый литерал". В доктайпах я не копенгаген, поэтому не знаю какой и куда нужно приставить. Если не сложно, пример, а не наводящие вопросы.

СообщениеДобавлено: 13.04.2007 (Пт) 13:20
tyomitch
Ну конечно, ведь открыть MSDN и найти в нём статью "DOCTYPE" -- это неподъёмно сложно...
Код: Выделить всё
<!DOCTYPE root [ <!ENTITY nbsp " "> ]><root>&nbsp;</root>

СообщениеДобавлено: 13.04.2007 (Пт) 13:59
Antonariy
Отнюдь, !DOCTYPE я нашел, но ни про !ENTITY ни про конструкцию <!DOCTYPE root []> там нет ни слова. Как и в MSXML 4.0 SDK.
Код: Выделить всё
doc.loadXML "<!DOCTYPE root [<!ENTITY nbsp ""& #32;"">]><root>&nbsp;</root>"
Элемент "root" используется, но не объявлен в DTD/Schema :wink:

СообщениеДобавлено: 13.04.2007 (Пт) 14:56
Konst_One
собственно, что-то странный по сути xml-документ какой-то :?:

может так:

Код: Выделить всё
<?xml version="1.0"?>
<root/>


или может тебе это надо:

Код: Выделить всё
<?xml version="1.0"?>
<root nbsp=" "/>


Код: Выделить всё
<?xml version="1.0"?>
<nbsp>& #160;</nbsp>

СообщениеДобавлено: 13.04.2007 (Пт) 15:58
Antonariy
Нет, мне нужно, чтобы <root>&любойтекст;</root> загрузилось без ошибок как и <root>любойтекст</root>.

ADD: А вообще-то ты мне подал мысль. &любойтекст; можно заменить на &amp;любойтекст;...

СообщениеДобавлено: 13.04.2007 (Пт) 18:05
tyomitch
Antonariy писал(а):Отнюдь, !DOCTYPE я нашел, но ни про !ENTITY ни про конструкцию <!DOCTYPE root []> там нет ни слова. Как и в MSXML 4.0 SDK.
Код: Выделить всё
doc.loadXML "<!DOCTYPE root [<!ENTITY nbsp ""& #32;"">]><root>&nbsp;</root>"
Элемент "root" используется, но не объявлен в DTD/Schema :wink:

Эх-ох... Вот тебе готовый год:

Код: Выделить всё
Sub Main()
Dim doc As New DOMDocument
doc.async = False
doc.validateOnParse = False
doc.loadXML "<!DOCTYPE root [<!ENTITY nbsp ""& #160;"">]><root>&nbsp;</root>"
Debug.Print Asc(doc.selectSingleNode("/root").Text)
End Sub

СообщениеДобавлено: 13.04.2007 (Пт) 22:23
Antonariy
Ну не надо так тяжело вздыхать :)
Зато я теперь знаю про валидацию...
Кстати, а можно ли отключить различие больших и маленьких букв, а то <root></ROOT> не проходит? И имеет ли смысл doc.async = False если данные грузятся из строки?

СообщениеДобавлено: 13.04.2007 (Пт) 22:35
tyomitch
Отключить различение нельзя.
doc.async = False прописано прямо в MSDN в сэмпле в статье про loadXML

[add]
loadXML просто оборачивает вокруг строки IStream, и передаёт его в load; так что естественно, что async оказывает эффект на них обоих
[/add]