![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по парсингу xml-файлов
Delp © (2010-04-01 11:46:00)Подскажите пожалуйста как получить содержимое тега следующего вида:
<text>Какой-то там <content>большой</content> текст.</text>
Использую стандартные xmlintf и xmldoc.
При обычном получении, типа:
str:= vartostr(node.childdocument.nodes['text'].NodeValue) вылетает ошибка "Element 'text' does not contain a single text node".
Как правильно отпарсить такого вида тэг?
Медвежонок Пятачок (2010-04-01 14:25:00) [1]вообще-то должна была помочь сама иде, через интеллисенс.
там же после точки предлагаются все свойства, а не только NodeValue
Дмитрий Белькевич (2010-04-01 14:24:00) [2]Гугль не поможет?
http://www.google.com.by/search?client=opera&rls=ru&q=GetAttribute+Returns+the+value+of+one+of+this+node's+attributes.&sourceid=opera&ie=utf-8&oe=utf-8
Медвежонок Пятачок (2010-04-01 14:23:00) [3]эмм... мало о чём говорит...
<Цитата>
Говорит мало, но достаточно для того, чтобы понять, что не стоит читать свойство НодеВалуе у узла, имеющего чайлд-узлы, ибо
Otherwise, trying to read or set NodeValue causes an exception.
Delp (2010-04-01 14:11:00) [4]эмм... мало о чём говорит...
Дмитрий Белькевич (2010-04-01 14:10:00) [5]
> что атрибутов в твоем документе нет ни одного
Общая идея: сообщениям компьютера стоит верить.
Медвежонок Пятачок (2010-04-01 14:08:00) [6]тогда снова см. [10]
Delp (2010-04-01 14:07:00) [7]), так я атрибут и не пытаюсь получить, я пытаюсь получить то что находится в <text></text>, а выдаётся ошибка, так как существуют внутренние тэги.
Медвежонок Пятачок (2010-04-01 14:02:00) [8]GetAttribute Returns the value of one of this node's attributes.
И какого атрибута значение ты надеешься при этом получить?
Тебе же русским языком сказали,
что атрибутовв твоем документе нет ни одного
Delp (2010-04-01 14:01:00) [9]
> это из справки по какому классу?
ixmlnode
Медвежонок Пятачок (2010-04-01 13:58:00) [10]это из справки по какому классу?
Delp (2010-04-01 13:47:00) [11]GetAttribute Returns the value of one of this node's attributes.
Это из справки.
Медвежонок Пятачок (2010-04-01 12:38:00) [12]Имеем ixmlnode и читаем его свойство NodeValue
В зависимости от того, чем является узел получаем: (встроенная документация)
ntAttribute The attribute value
ntElement If the element contains only text, this is that text value. Otherwise, trying to read or set NodeValue causes an exception.
....
Медвежонок Пятачок (2010-04-01 12:30:00) [13]ГетАттрибуте возвращает ссылку на атрибут, а не его значение.
Delp (2010-04-01 12:29:00) [14]Нет, значение атрибута получается функцией GetAttribute.
Delp (2010-04-01 12:29:00) [15]Соответственно node указывает на <section>.
Медвежонок Пятачок (2010-04-01 12:28:00) [16]NodeValue - это значение атрибута.
Атрибутов у твоего документа нет ни одного
Медвежонок Пятачок (2010-04-01 12:27:00) [17]
Q >на какой узел указывает node?
A >Вообще, суть не в этом
Q: Как правильно отпарсить такого вида тэг?
Вообще, суть не в этом, а есть ли жизнь на марсе.
Вот в чем суть.
Delp (2010-04-01 12:27:00) [18]Суть в том, что я не могу получить текст между двумя открывшимися тэгами.
Вот этот код успешно компилируется, но во время выполнения вылетает ошибка:
var xmldoc:TXmlDocument;
node:IXmlnode;
str:string;
begin
XMLDoc := TXMLDocument.Create(Application);
XMLDoc.Active := True;
xmldoc.LoadFromFile('1.xml');
node:= xmldoc.ChildNodes.Nodes['section'];
str:= vartostr(node.childnodes.nodes['text'].NodeValue); //- здесь при выполнении вылетает ошибка
brother (2010-04-01 12:06:00) [19]> Вообще, суть не в этом
ты уверен?
Delp (2010-04-01 12:06:00) [20]Вообще, суть не в этом. Для правильности пусть будет так:
<section>
<text>Какой-то там <content>большой</content> текст.</text>
<section>
А в делфи так:
var xmldoc:TXmlDocument;
node:IXmlDocument;
begin
xmldoc.LoadFromFile('SCDA.xml');
node:= xmldoc.ChildNodes.Nodes['section'];
str:= vartostr(node.childdocument.nodes['text'].NodeValue); //- здесь при выполнении вылетает ошибка
end;