Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Tag & Attribute XML   Найти похожие ветки 

 
stelius ©   (2004-03-09 15:33) [0]

Господа, такой вопросец. Есть XML документ формата:
<root>
 <table name="Table">
   <record id="1">    
     <field name="r1Field1"> какое-то значение </field>
     ...
     <field name="r1FieldN"> какое-то значение </field>
   </record>
   ...
   <record id="n">
     <field name="r2Field1"> какое-то значение </field>
     ...
     <field name="r2FieldN"> какое-то значение </field>
   </record>
 </table>
</root>


Как мне открыть tag с определенным attribute"ом.
Например, я хочу получить значение tag"а с attribute"ом r1Field2.

Пишу в Delphi 5, для работы с XML использую GmXML.


 
Erik ©   (2004-03-09 15:50) [1]

Думаю тебе надо получить сначала Node, для этого пробежатся по
деткам. Типа
for i := 0 to fDoc.DocumentElement.ChildNodes.Count - 1 do
 fDoc.DocumentElement.ChildNodes[i]
А далее получить атрибут aNode.GetVarAttr(AttrId, -1)
Это код для SimpleXML, но идея общая.


 
stelius ©   (2004-03-09 16:36) [2]

Я так понимаю, что после получения Node мне надо от начала до конца их просмотреть и у каждого проверить значение attribute"а и если оно совпадает с нужным, тогда получить значение самого Node. Дык это же сколько трудозатрат.
Если у меня записей полно и значения нужно в разных местах программы получать, то из-за одного значения надо лопатить все n-дцать Node.
Нет ли какого нибудь способа чтобы сразу открыть tag, если я знаю его наименование и значение его attribute"а. Или что-то подобное XPath.


 
Ш-К   (2004-03-09 16:40) [3]

А вы думаете, если существует где-нить такая функция, она в своём теле не пробегается по всему документу.


 
just me   (2004-03-09 16:42) [4]

А этот GmXML поддерживает XPath? Но проще ли вообще использовать MS XMLDOM?


 
stelius ©   (2004-03-09 17:15) [5]

2 Ш-К
Наверно вы правы, обсуждать не берусь вследствие того что не владею данным вопросом. Но все-таки хотелось бы узнать о существовании данной функции (если она есть). Согласитесь глупо "изобретать велосипед".

2 just me

Перво-наперво ThankU за ссылочки по поводу импорта MSXML.(off topic).

GmXML использую из-за того, что с ним на данный момент более менее разобрался. Сейчас читаю вышеупомянутые ссылки.

Что за зверь такой MS XMLDOM! Как в нем решается вышеописанная проблема.


 
just me   (2004-03-09 18:12) [6]

MSXML есть стандартный XML-парсер, включенный практически во все винды, XMLDOM просто объектная модель, поддерживаемая MSXML и обеспечивающая доступ к нодам и атрибутам как к коллекциям. Ну и, естественно, поддерживается язык запросов XPath. Материалов в сети об этом масса, можно почитать, например, для начала это:
http://www.citforum.ru/internet/xml1/index.shtml
http://www.citforum.ru/internet/xml2/index.shtml


 
stelius ©   (2004-03-10 11:42) [7]

Что-то я никак не разберусь с XML"ем на практическом уровне. Похоже совсем туплю. Пишу:

var
 XMLDoc        : IXMLDOMDocument;
begin
 XMLDoc.load("c:\Test.xml");
end;


А мне av вываливается.
В GmXML было LoadFromFile, а в MSXML по смыслу подходят Load и LoadXML или это не то.
Народ помогите, мне просто необходим маленький примерчик.


 
just me   (2004-03-10 11:58) [8]

AV возникает потому, что переменная не иниализированна XMLDoc - объекта еще просто нет, а уже вызывают его методы. Нужно его создать сначала:
XMLDoc := CoXMLDOMDocument.Create();
Далее. Load и LoadXML загружают соответственно документ по ссылке (на файл или URL) и по текстовой строке, содержащей тело самого документа, так что это именно то...


 
stelius ©   (2004-03-10 12:01) [9]

А что значит CoXMLDOMDocument?


 
Тимохов ©   (2004-03-10 12:05) [10]


>
> stelius ©   (10.03.04 12:01) [9]
> А что значит CoXMLDOMDocument?

Это co-класс, который дельфи должна была вам сама создать при импорте библиотеки типов. Create - классовый метод данного класса (т.е. class function), в котором дельфи сама должна была создать вам что-то типа такого

Result := CreateComObject(CLASS_XML_bla_bla_bla) as IXMLDOMDocument;

Вы бибилиотеку типов импоритровали?


 
stelius ©   (2004-03-10 12:12) [11]

Импортировал. (в Delphi5/Imports лежит MSXML2_TLB)
Delphi на CoXMLDOMDocument ругается Undeclare identifier.


 
Тимохов ©   (2004-03-10 12:21) [12]

Я в аналогичном случае создаю документ так
var
  kDoc: DOMDocument;
begin
  kDoc := CoDOMDocument.Create();
end;


 
just me   (2004-03-10 12:29) [13]

Посмотреть в конце текста MSXML2_TLB, там должна быть декларация Со-класса типа

 xxx = class
   class function Create: IXMLDOMDocument;
   class function CreateRemote(const MachineName: string): IXMLDOMDocument;
 end;
Вот это xxx и есть его имя


 
Тимохов ©   (2004-03-10 12:35) [14]

У меня при использовании MsXml сложилось ощущение, что юзать надо не IXMLDocDocument, а DomDocument (который фактически равен
IXMLDocDocument), т.к. насколько я понимаю в случае перехода на новую версию MsXml (т.е. после соответствующего импорта) DomDocument будет вказывать на последнюю версию IXMLDocDocument. Но это так - мое имхо.


 
stelius ©   (2004-03-10 13:44) [15]

Уф, с create"ом общими услиями разобрались. Thanks 2 All.
Извините за назойливость, возникли непоняки с составление XPath.
Пишу:

var
 XMLDoc        : DOMDocument;
 XMLNode       : IXMLDOMNode;
begin
 ...
 XMLNode := XMLDoc.selectSingleNode(
   "/root/table["Table"]/record[1]/field["r1Field1"]"
 );
end;


Возвращает nil, но ведь данный элемент присутствует в xml-файле.
Похоже я не правильно составляю XPath.
Можно ли в квадратных скобках указывать значение attribute"а если оно имеет строковый тип, а не целочисленный.


 
Shaman_Naydak   (2004-03-10 14:46) [16]

XMLNode := XMLDoc.selectSingleNode(
  "/root/table[@name="Table"]/record[id="1"]/field[@name="r1Field1"]");


 
Shaman_Naydak   (2004-03-10 14:48) [17]

Пропустил @
XMLNode := XMLDoc.selectSingleNode(
 "/root/table[@name="Table"]/record[@id="1"]/field[@name="r1Field1"]");


 
stelius ©   (2004-03-10 14:57) [18]

Thanks U Shaman_Naydak.



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.039 c
8-1069441364
Eagle Owl
2003-11-21 22:02
2004.03.28
Direct3DRM


14-1077712071
Vlad
2004-02-25 15:27
2004.03.28
И снова пингвины...


3-1076332096
Pilot
2004-02-09 16:08
2004.03.28
Работа с EasyTable


3-1077959547
Michail Dalakov
2004-02-28 12:12
2004.03.28
Oracle и побитовые операции


14-1077853110
CrytoGen
2004-02-27 06:38
2004.03.28
библиотечные функции, которых нет в Delphi