Форум: "Основная";
Текущий архив: 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