Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2015, 08:14   #1
adminsamara
Пользователь
 
Регистрация: 05.02.2014
Сообщений: 13
По умолчанию Delphi xml

Имеется XML (иногда некоторых тегов может не быть):
(может открыть xml, обойти все теги в цикле, найти нужные и присвоить значение, но как это сделать? ) С XML первый раз сталкиваюсь
Цитата:
<?xml version="1.0" encoding="utf-8"?>
<TaskArchive xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0" xmlns="http://site.ru/max/">
<Description>
<UserName>Иванов И.И.</UserName>
<Division>ООО Дом</Division>
<ExportDate>2015-05-20T15:17:29.0609734+04:00</ExportDate>
</Description>
<Data><Task xmlns="http://site.ru/max/"><ShortTask UniqueId="e9c3df2e-adb1-43d2-884f-680512b68518"><ActivityDurationDays >111</ActivityDurationDays><Activity Title="СИСИС" /><CategoryType>Order</CategoryType><Object Title="вап" Caption="88" /><TaskNumber>НОМЕР</TaskNumber><TaskYear>2015</TaskYear><TaskDate>2015-05-16</TaskDate><BeginDate>2015-05-17</BeginDate><EndDate>2015-05-18</EndDate><BlankNumber>123456789</BlankNumber><ActivityPlace Title="SSS" /><ActivityPhone>12345</ActivityPhone><CriminalCase Title="ДПОП" Caption="ОО" /><CriminalCaseNumber>34-234-3</CriminalCaseNumber><CriminalCaseNam e>выарддд</CriminalCaseName><ObjectAlias>Иванч ег А.В. 88а-РЕГНОМЕР</ObjectAlias><JoinOpu>0</JoinOpu><Division Title="ДДДДД" Caption="84EFD93D-5E41-4225-BB11-3B02D03E9B75" /><TaskType>1</TaskType><TaskMN>1596</TaskMN><IMSI>25864</IMSI><IMEI>654321</IMEI><PrivacyLevel Title="Род" Caption="3" /><State>WithoutTaskMission</State></ShortTask><PhysAddress UniqueId="f814a845-7c36-49c6-bdf9-0bd12f36dcdd"><Region Title="Жук" /><Discrict Title="Майский" Caption="БОГ" /><Town Title="В. НОВГОРОД" Caption="В. " /><Street Title="Аврора" /><HouseNumber>646</HouseNumber><Building>685</Building><Flat>356</Flat></PhysAddress><Physical UniqueId="1fbf5bad-839f-4b57-81e5-f438aa40b085"><LastName Title="Козлов" Caption="ВАВ" /><FirstName Title="АПАР" Caption="АПА" /><Patronymic Title="ВАЛЕРЬЕВИЧ" Caption="ВАЛ" /><BirthDay>2015-05-14</BirthDay><Sex Title="М" /><Alias>авпр</Alias><EruditionLevelOrd Title="ДА" /><Accents>смве</Accents></Physical><TaskInitiator><Subdivisio n Title="Таз" Caption="ОО" /><Agency Title="ЧКФ" /><FullName Title="Зайкин А.А." Caption="Комолов А.А." /><PhoneA>99599999</PhoneA><PhoneB>841351418</PhoneB></TaskInitiator><Orientation><Crimina lDirection Title="КОНИКС" /><Citizenship Title="Роман" /><Nationality Title="Котят" /><CriminalCategory Title="Маркетинг" /></Orientation><Target><Target>впавквы ыва вап выфп асп</Target></Target><Sanction><JuridicalOrder>8</JuridicalOrder><Period>5</Period><SanctionDate>2015-05-16</SanctionDate><IsFromConnectionMomen t>0</IsFromConnectionMoment><SanctionPer son><Agency>Москва</Agency><Post>Руководитель</Post><FullName>Молотов В.В.</FullName></SanctionPerson></Sanction><AgencyDirectionAlt><Capti onTo>РооРоо</CaptionTo><CaptionFor>Казин А.А.</CaptionFor></AgencyDirectionAlt><TaskEffectivene ss><EffectivenessSign>0</EffectivenessSign><JudgeLegalize>0</JudgeLegalize></TaskEffectiveness><CriminalClauses> <CriminalClause><ParagraphNumber Title="232" Caption="Мороз" /><SubparagraphNumber>3</SubparagraphNumber></CriminalClause></CriminalClauses></Task></Data>
</TaskArchive>
Как сохранить содержимое между тегами?
пробовал так

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  XMLDoc: DOMDocument;
  Root: IXMLDOMElement;
begin
  XMLDoc := CoDOMDocument.Create;
  XMLDoc.Load('c:\\21.xml');
  Root := XMLDoc.DocumentElement;
  ShowMessage(Root.SelectSingleNode('Description/UserName').Text);
  ShowMessage(Root.SelectSingleNode('Description/Division').Text);
  ShowMessage(Root.SelectSingleNode('Description/ExportDate').Text);
  ShowMessage(Root.SelectSingleNode('.//ActivityDurationDays').Text);
  Root := nil;
  XMLDoc := nil;
end;
но никак немогу добраться до
Код:
<Object Title="вап" Caption="88" />
на другом форуме подсказывали так:
Код:
uses Winapi.msxml, ComObj;
 
procedure TForm1.SomeFunc(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
const
  XMLFileName = 'Твой XML файл.xml';
 
var
  LDocument: IXMLDOMDocument2;
  LRoot, LChildNode : IXMLDOMNode;
begin
  // Загружаем XML
  LDocument := CoDOMDocument.Create;
  LDocument.async := False;
  LDocument.Load(XMLFileName);
  OleCheck(LDocument.parseError.errorCode);
 
 
  LDocument.setProperty('SelectionNamespaces', 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"');
 
  // XPath очень быстро
  LDocument.setProperty('SelectionLanguage', 'XPath');
 
  LRoot := LDocument.documentElement;
 
  LChildNode := LRoot.selectSingleNode('.//ActivityDurationDays');
 
  if Assigned(LChildNode) then
  begin
    // Тут никак не могу вывести в showmessage
  end;
end;

Последний раз редактировалось Stilet; 24.12.2015 в 09:34.
adminsamara вне форума Ответить с цитированием
Старый 24.12.2015, 09:39   #2
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

ставьте комплект jedi. в нём есть несколько примеров работы с этим форматом. гляните исходники всё будет понятно. например JvSimpleXML.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума Ответить с цитированием
Старый 24.12.2015, 09:48   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Лучше изучите xPath.
//TaskArchive/Data/Task/ShortTask[@UniqueId="e9c3df2e-adb1-43d2-884f-680512b68518"]/Object[@Caption]
Вот так я доберусь до значения атрибута Caption у конкретного ShortTask (по значению UniqueId).
Человек_Борща вне форума Ответить с цитированием
Старый 24.12.2015, 10:44   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.Button2Click(Sender: TObject);
function XmlFindNode(XML: TXMLDocument; NodeName: String; var Node: IXMLNode): Boolean;
var s1,s2: String;
    i: Integer;
begin
  Result:=False;
  s1:=NodeName;
  Node:=XML.Node;
  while s1<>'' do begin
    i:=Pos('/',s1);
    if i>0 then begin s2:=Copy(s1,1,i-1); s1:=Copy(s1,i+1,Length(s1)); end
           else begin s2:=s1; s1:=''; end;
    Node:=Node.ChildNodes.FindNode(s2);
    if Node=nil then Exit;
  end;
  Result:=True;
end;
var XML: TXMLDocument;
    Node: IXMLNode;
begin
  XML:=TXMLDocument.Create(Self);
  XML.Options:=XML.Options-[doAttrNull];
  try
    try
      XML.LoadFromFile('e:\Untitled1.xml');
      if not XmlFindNode(XML,'TaskArchive/Data/Task/ShortTask/CriminalCase',Node) then begin
        ShowMessage('TaskArchive/Data/Task/ShortTask/CriminalCase не найден');
        Exit;
      end;
      Memo1.Lines.Add('Title = '+Node.Attributes['Title']);
      Memo1.Lines.Add('Caption = '+Node.Attributes['Caption']);

      Node.Attributes['Title']:='Новое значение для Title';
      Node.Attributes['Caption']:='Новое значение для Caption';

      Memo1.Lines.Add('Новые значения');
      Memo1.Lines.Add('Title = '+Node.Attributes['Title']);
      Memo1.Lines.Add('Caption = '+Node.Attributes['Caption']);

//      XML.SaveToFile('e:\Untitled1.xml');
    except
      ShowMessage('ошибка открытия');
    end;
  finally
    XML.Free;
  end;
end;
Цитата:
Лучше изучите xPath
Чем? XMLDocument и делай что хочешь
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.12.2015, 16:21   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Чем? XMLDocument и делай что хочешь
Право не ожидал о_О
Код:
XMLDocument.root.SelectSingleNode('TaskArchive/Data/Task/ShortTask/CriminalCase').getAttribute('Title')
И не надо никаких извращений. Можно несколько нодов выбрать через selectNodes да ещё с условиями @Title != '' и т.д. и т.п.
Человек_Борща вне форума Ответить с цитированием
Старый 24.12.2015, 16:32   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А-а, вместо SelectSingleNode небольшая функция, делающая то же самое, извращение?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.12.2015, 16:56   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А-а, вместо SelectSingleNode небольшая функция, делающая то же самое, извращение?
да, ибо вы переписали то что есть.

XPath мощнее.
например можно по атрибуту отфильтровать.
или выбрать все элементы elem независимо от вложености и тп.(но с фильтром например)
XPath это ближе к SQL.
вы же не будете писать свою БД?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа, которая должна находить в данной директории *.xml файлы и переименовывать в *.xml.dt. (Delphi) nice.name Помощь студентам 2 09.01.2013 15:40
XML и Delphi hamsidJ БД в Delphi 1 20.01.2012 18:49
Из XML в Delphi IzIFRag Общие вопросы Delphi 6 02.08.2010 16:06
xml в delphi /Arven/ Компоненты Delphi 0 23.04.2008 22:47
Xml и Delphi KlErik Общие вопросы Delphi 2 14.05.2007 09:54