Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить следующие XML значения ? [D7, WinXP]


Страницы:   1 2

МистерТ ©   (2008-07-21 14:20:00) 

Здравствуйте!
Столкнулся с достаточно глупой проблемой :(
В XMLDocument загружен файл и в нем есть следующие строки:
<body>
   <data value="some data"/> <!-- connent -->
   <data value="another data"/>
</body>

Как получить доступ к тегу value ?
Через ChildNodes['data'].Attributes['value'] данные получить можно, но только для первого параметра. Замена ChildNodes['1'].XML вообще дает строку содержащую комментарий.
Заранее благодарю за ответы.


Медвежонок Пятачок   (2008-07-21 15:30:00) [1]

Вот так что ли полная форма "влияет"?
<body>
  <data value="some data"> <!-- connent -->
  </data>
  <data value="another data"/>
</body>

Так у тебя комент стал чайлдом первого узла "data". А в исходном примере он был чайлдом ула "body"

И никакая "полная" форма ни на что не "повлияла"
Структура поменялась и все.


Медвежонок Пятачок   (2008-07-21 15:22:00) [2]

Кстати еще фик поймешь по твоему коду чьи именно чайлды ты опрашиваешь


Медвежонок Пятачок   (2008-07-21 15:20:00) [3]

И сокращенная форма играет роль, т.к. не меня код
ChildNode[1].Attributes['value'] но меняя XML на полную форму я получаю либо рабочий вариант, либо EVariantCastError.


меняя код на полную ты сам того не замечая структуру меняешь и твой комент видимо уплывает из чайлдов data в чайлды боди.
Либо еще куда. Без фотографии не лечим.


Медвежонок Пятачок   (2008-07-21 15:15:00) [4]

И сокращенная форма играет роль, т.к. не меня код

Для одаренных:
Не меняет она ничего.


Медвежонок Пятачок   (2008-07-21 15:15:00) [5]

структура скопирована из твоего вопроса один в один.


Медвежонок Пятачок   (2008-07-21 15:14:00) [6]

На, удивись.

procedure TForm1.Button1Click(Sender: TObject);
var root : IXMLNode; i : integer;
begin
XMLDocument1.LoadFromFile('C:\test.xml');
root := XMLDocument1.ChildNodes[0];
Caption := Root.NodeName;
for i := 0 to Pred(Root.ChildNodes.Count) do
 showmessage(root.ChildNodes.Nodes[i].NodeName);

//вот значение твоего атрибута value второго нода data
ShowMessage(root.ChildNodes[2].Attributes['value']);
end;


МистерТ   (2008-07-21 15:12:00) [7]

> '2' привелось просто к двойке
EOleException with message 'This name may not begin with the '2' charapter -->2<--'
Комментарий тут просто для примера.

И сокращенная форма играет роль, т.к. не меня код
ChildNode[1].Attributes['value']но меняя XML на полную форму я получаю либо рабочий вариант, либо EVariantCastError.


Медвежонок Пятачок   (2008-07-21 15:07:00) [8]

перечисли через ShowMessage в цикле все чайлды узла дата и все увидишь.
Имя, тип и так далее


Медвежонок Пятачок   (2008-07-21 15:04:00) [9]

Мне нужен атрибут чайлда под номером два, но из-за сокращенной формы
<data ... />
вместо
<data ...></data>
получить атрибут стандартными свойствами не получается...


Сокращенная форма здесь не причем.
И узел, который тебе нужен не два. Коментарий это точно такой же узел как и все другие.
И в спике childnodes он присутствует.


Медвежонок Пятачок   (2008-07-21 15:03:00) [10]

ChildNodes : IXMLNodeList

property Nodes[const IndexOrName: OleVariant]: IXMLNode; default;

Для тех кто доку из танка читать не может.

'2' привелось просто к двойке


МистерТ   (2008-07-21 15:01:00) [11]

> Медвежонок Пятачок ©   (21.07.08 14:59) [11]
> Сам-то понял что написал ?
>
> тебе нужен чайлд с индексом ДВА а не один.
> под единицей там коммент.

Мля, нет же.
Мне нужен атрибут чайлда под номером два, но из-за сокращенной формы
<data ... />
вместо
<data ...></data>
получить атрибут стандартными свойствами не получается...


Медвежонок Пятачок   (2008-07-21 14:59:00) [12]

Сам-то понял что написал ?

тебе нужен чайлд с индексом ДВА а не один.
под единицей там коммент.


Медвежонок Пятачок   (2008-07-21 14:58:00) [13]

Значит средствами XMLDocument - ни как...буду знать...

Что никак?
Как. Только из поисковых средств там только навигационные.
Вот и все.


МистерТ   (2008-07-21 14:58:00) [14]

> Медвежонок Пятачок ©   (21.07.08 14:55) [6]
> совсем тормоз что ли?

Я бы по просил повежливее.

> ChildNodes['2'].XML
Сам-то понял что написал ?
Мне узел с именем 2 не нужен...
З.Ы. кстати тебе процитировать, что Делфи напишен на такое ?


Медвежонок Пятачок   (2008-07-21 14:57:00) [15]

ChildNode[1].Attributes['value'] -> EVariantCastError (NULL -> String)

У нода есть тип.
В том числе тип "комментарий"
Для того, чтобы у коментариев атрибуты не читали.
А у Attributes есть count


МистерТ   (2008-07-21 14:56:00) [16]

> selectsinglenode('/body/data[1]/@value') вернет атрибут
> value нужного тебе нода

Сейчас гляну...
Значит средствами XMLDocument - ни как...буду знать...


Медвежонок Пятачок   (2008-07-21 14:55:00) [17]

совсем тормоз что ли?

Через ChildNodes['data'].Attributes['value'] данные получить можно, но только для первого параметра. Замена ChildNodes['1'].XML вообще дает строку содержащую комментарий.

ChildNodes['2'].XML


МистерТ   (2008-07-21 14:53:00) [18]

> Медвежонок Пятачок ©   (21.07.08 14:42) [3]
Ты меня кажется не понял :)
Вот смотри:
В TXMLDocument загружен файл содержащий следующее:
<body>
   <data value = "some value"/> <!-- comment -->
   <data value = "another value">
   <child value = "some text 1">
       some text 2
   </child>
</body>

через ChildNode['child'].Attributes['value']доступен some text 1, а через ChildNode['child'].Text- some text 2.
Но вот с тэгами data возникает ерунда.
ChildNode['data'].Attribute['value']= some valueи все, а если перебрать по индексам
ChildNode[1].Attributes['value']-> EVariantCastError (NULL -> String)
Далее пробуем экспериментировать:
ChildNode[1].XML= '<!-- comment -->'
ChildNode[1].Text= comment

Как все-таки вытянуть valueиз обоих data???


Медвежонок Пятачок   (2008-07-21 14:43:00) [19]

selectsinglenode('/body/data[1]/@value') вернет атрибут value нужного тебе нода


Медвежонок Пятачок   (2008-07-21 14:42:00) [20]

форма-то здесь причем?
тебе нужен второй пофик какой чайлд.
либо первый (считая с нуля) чайлд с именем "дата"

Первое доступно в TXMLDocument
Второе в IXMLDOMDocument2 понимающем XPATH


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо