Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.084 c
14-1078385774
TUser
2004-03-04 10:36
2004.03.28
Linux for чайник


1-1078491561
Canon
2004-03-05 15:59
2004.03.28
Запись файла в Excel


6-1073621638
Hooch
2004-01-09 07:13
2004.03.28
Outlook Express


3-1077877254
Алексей
2004-02-27 13:20
2004.03.28
DbGrid выделенные строки


1-1078484538
Bill Gates
2004-03-05 14:02
2004.03.28
Перезват вывода программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский