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