Конференция "Основная" » Как получить следующие XML значения ? [D7, WinXP]
 
  • МистерТ (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]
    И сокращенная форма играет роль, т.к. не меня код

    Для одаренных:
    Не меняет она ничего.
  • Медвежонок Пятачок © (21.07.08 15:20) [20]
    И сокращенная форма играет роль, т.к. не меня код
    ChildNode[1].Attributes['value'] но меняя XML на полную форму я получаю либо рабочий вариант, либо EVariantCastError.


    меняя код на полную ты сам того не замечая структуру меняешь и твой комент видимо уплывает из чайлдов data в чайлды боди.
    Либо еще куда. Без фотографии не лечим.
  • Медвежонок Пятачок © (21.07.08 15:22) [21]
    Кстати еще фик поймешь по твоему коду чьи именно чайлды ты опрашиваешь
  • Медвежонок Пятачок © (21.07.08 15:30) [22]
    Вот так что ли полная форма "влияет"?
    <body>
      <data value="some data"> <!-- connent -->
      </data>
      <data value="another data"/>
    </body>

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

    И никакая "полная" форма ни на что не "повлияла"
    Структура поменялась и все.
 
Конференция "Основная" » Как получить следующие XML значения ? [D7, WinXP]
Есть новые Нет новых   [134491   +13][b:0][p:0.002]