-
Здравствуйте!
Столкнулся с достаточно глупой проблемой :(
В XMLDocument загружен файл и в нем есть следующие строки:
<body>
<data value="some data"/> <!-- connent -->
<data value="another data"/>
</body>
Как получить доступ к тегу value ?
Через ChildNodes['data'].Attributes['value'] данные получить можно, но только для первого параметра. Замена ChildNodes['1'].XML вообще дает строку содержащую комментарий.
Заранее благодарю за ответы.
-
Замена ChildNodes['1'].XML вообще дает строку содержащую комментарий.
Ну все верно. Это чайлд с индексом 1
-
> Медвежонок Пятачок © (21.07.08 14:27) [1]
> Замена ChildNodes['1'].XML вообще дает строку содержащую
> комментарий.
>
> Ну все верно. Это чайлд с индексом 1
Ну как бы может и верно, но как получить доступ к value при такой сокращенной форме <.../> ?
-
форма-то здесь причем?
тебе нужен второй пофик какой чайлд.
либо первый (считая с нуля) чайлд с именем "дата"
Первое доступно в TXMLDocument
Второе в IXMLDOMDocument2 понимающем XPATH
-
selectsinglenode('/body/data[1]/@value') вернет атрибут value нужного тебе нода
-
> Медвежонок Пятачок © (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
???
-
совсем тормоз что ли?
Через ChildNodes['data'].Attributes['value'] данные получить можно, но только для первого параметра. Замена ChildNodes['1'].XML вообще дает строку содержащую комментарий.
ChildNodes['2'].XML
-
> selectsinglenode('/body/data[1]/@value') вернет атрибут
> value нужного тебе нода
Сейчас гляну...
Значит средствами XMLDocument - ни как...буду знать...
-
ChildNode[1].Attributes['value'] -> EVariantCastError (NULL -> String)
У нода есть тип.
В том числе тип "комментарий"
Для того, чтобы у коментариев атрибуты не читали.
А у Attributes есть count
-
> Медвежонок Пятачок © (21.07.08 14:55) [6]
> совсем тормоз что ли?
Я бы по просил повежливее.
> ChildNodes['2'].XML
Сам-то понял что написал ?
Мне узел с именем 2 не нужен...
З.Ы. кстати тебе процитировать, что Делфи напишен на такое ?
-
Значит средствами XMLDocument - ни как...буду знать...
Что никак?
Как. Только из поисковых средств там только навигационные.
Вот и все.
-
Сам-то понял что написал ?
тебе нужен чайлд с индексом ДВА а не один.
под единицей там коммент.
-
> Медвежонок Пятачок © (21.07.08 14:59) [11]
> Сам-то понял что написал ?
>
> тебе нужен чайлд с индексом ДВА а не один.
> под единицей там коммент.Мля, нет же.
Мне нужен атрибут чайлда под номером два, но из-за сокращенной формы
<data ... />
вместо
<data ...></data>
получить атрибут стандартными свойствами не получается...
-
ChildNodes : IXMLNodeList
property Nodes[const IndexOrName: OleVariant]: IXMLNode; default;
Для тех кто доку из танка читать не может.
'2' привелось просто к двойке
-
Мне нужен атрибут чайлда под номером два, но из-за сокращенной формы
<data ... />
вместо
<data ...></data>
получить атрибут стандартными свойствами не получается...
Сокращенная форма здесь не причем.
И узел, который тебе нужен не два. Коментарий это точно такой же узел как и все другие.
И в спике childnodes он присутствует.
-
перечисли через ShowMessage в цикле все чайлды узла дата и все увидишь.
Имя, тип и так далее
-
> '2' привелось просто к двойкеEOleException with message 'This name may not begin with the '2' charapter -->2<--'
Комментарий тут просто для примера.
И сокращенная форма играет роль, т.к. не меня код
ChildNode[1].Attributes['value']
но меняя XML на полную форму я получаю либо рабочий вариант, либо EVariantCastError.
-
На, удивись.
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;
-
структура скопирована из твоего вопроса один в один.
-
И сокращенная форма играет роль, т.к. не меня код
Для одаренных:
Не меняет она ничего.
-
И сокращенная форма играет роль, т.к. не меня код
ChildNode[1].Attributes['value'] но меняя XML на полную форму я получаю либо рабочий вариант, либо EVariantCastError.
меняя код на полную ты сам того не замечая структуру меняешь и твой комент видимо уплывает из чайлдов data в чайлды боди.
Либо еще куда. Без фотографии не лечим.
-
Кстати еще фик поймешь по твоему коду чьи именно чайлды ты опрашиваешь
-
Вот так что ли полная форма "влияет"?
<body>
<data value="some data"> <!-- connent -->
</data>
<data value="another data"/>
</body>
Так у тебя комент стал чайлдом первого узла "data". А в исходном примере он был чайлдом ула "body"
И никакая "полная" форма ни на что не "повлияла"
Структура поменялась и все.