powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помощь с XML
17 сообщений из 17, страница 1 из 1
Помощь с XML
    #39770846
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите разобрать XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<ns:Documents xmlns:tc="http://fsrar.ru/WEGAIS/Ticket" xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef" xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="1.0">
<ns:Owner>
<ns:FSRAR_ID>3463047</ns:FSRAR_ID>
</ns:Owner>
<ns:Document>
<ns:Ticket>
<tc:TicketDate>2019-02-07T19:30:01.2379309</tc:TicketDate>
<tc:Identity/>
<tc:DocId>FACDD59F-6138-4C73-A8DB-B74BF96202C3</tc:DocId>
<tc:TransportId>6c1e1916-f547-4d28-9fb2-a741054d4d08</tc:TransportId>
<tc:RegID/>
<tc:DocHash/>
<tc:DocType>QueryResendDoc</tc:DocType>
<tc:Result>
<tc:Conclusion>Rejected</tc:Conclusion>
<tc:ConclusionDate>2019-02-07T19:30:01.2379309</tc:ConclusionDate>
<tc:Comments>
Накладная не найдена или предназначена другому грузополучателю Владелец ["020000442214"].
</tc:Comments>
</tc:Result>
</ns:Ticket>
</ns:Document>
</ns:Documents>



Мне нужна строка
Код: xml
1.
2.
3.
<tc:Comments>
Накладная не найдена или предназначена другому грузополучателю Владелец ["020000442214"].
</tc:Comments>



Сам код
Код: pascal
1.
XMLDocument2.ChildNodes['ns:Documents'].ChildNodes['ns:Document'].ChildNodes['ns:Ticket'].ChildNodes['tc:Result'].ChildNodes['tc:Comments'].NodeName



Но получаю
Node "ns:Documents" not found.

Большая просьба ткнуть пальцем где туплю.
...
Рейтинг: 0 / 0
Помощь с XML
    #39770848
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, только на форум кинул как сам понял свой косяк :)
...
Рейтинг: 0 / 0
Помощь с XML
    #39770854
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотри как выполнить xquery запрос на обычном парсере от ms, весьма мощная штука для выдергивания одиночных значений из xml без полного парсинга документа
...
Рейтинг: 0 / 0
Помощь с XML
    #39770855
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поторопился
Теперь просто null выводит
код такой
Код: pascal
1.
2.
3.
memo1.Lines.add(VarToStr(XMLDocument2.DocumentElement.ChildNodes['ns:Documents'].ChildNodes['ns:Document'].ChildNodes['ns:Ticket'].ChildNodes['tc:Result'].ChildNodes['tc:Comments'].Text));
                 memo1.Lines.Add('***');
                  memo1.Lines.add(VarToStr(XMLDocument2.DocumentElement.ChildNodes['ns:Documents'].ChildNodes['ns:Document'].ChildNodes['ns:Ticket'].ChildNodes['tc:Result'].ChildNodes['tc:Comments'].NodeValue));
...
Рейтинг: 0 / 0
Помощь с XML
    #39771006
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему Documents у тебя расценивается как Child node, когда он Root?
ps MSXML не знаю, может, у него и так
...
Рейтинг: 0 / 0
Помощь с XML
    #39771050
kv67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
  memo1.Lines.add(VarToStr(XMLDocument2.DocumentElement.ChildNodes[1].
    ChildNodes[0].ChildNodes[7].ChildValues['Comments']));
...
Рейтинг: 0 / 0
Помощь с XML
    #39771436
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gallemar,

Делай проще:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
var
  v: variant;

   procedure ParseXML(sNode: IXMLNode);
   var
    aNode: IXMLNode;
   begin
    aNode := snode;
    while aNode<>nil do
      begin
        if aNode.NodeName='tc:Comments' then
          begin
            v := aNode.NodeValue;
            break;
          end;
        if aNode.ChildNodes.First<>nil then
          ParseXML(aNode.ChildNodes.First);
        aNode := aNode.NextSibling;
      end;
   end;

begin
  XMLDocument.FileName := 'd:\work\dd.xml';
  XMLDocument.Active := true;
  ParseXML(XMLDocument.ChildNodes.First);
  XMLDocument.Active := false;


и никаких проблем.
...
Рейтинг: 0 / 0
Помощь с XML
    #39771497
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е полный скан документа это и есть проще? Я же вроде в первом же сообщении написал что xquery решит проблему поиска одиночной ноды но нет, надо же поипаться от души :)
...
Рейтинг: 0 / 0
Помощь с XML
    #39771529
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
энди,

Речь шла не о xquery, а стандартном TXMLDocument. Это был приведен фрагмент XML, а не полный XML документ.
В реальности документов (накладных) в XML документе может быть гораздо больше, и парсить документ все равно придется.
...
Рейтинг: 0 / 0
Помощь с XML
    #39771616
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и чем же помешает парсить документ xquery? :) по мне так он еще и сделает это намного более удобным :)
...
Рейтинг: 0 / 0
Помощь с XML
    #39771619
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя правильнее пожалуй писать xpath
...
Рейтинг: 0 / 0
Помощь с XML
    #39771633
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
эндихотя правильнее пожалуй писать xpath
Да ради бога, пишите.
...
Рейтинг: 0 / 0
Помощь с XML
    #39772104
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bali
/зануда mode on
Вообще парсинг - это чтение чтение из текста и преобразование в объектную модель, а у тебя просто рекурсивный поиск перебором
/зануда mode off

Вообще тут непонятная трабла. Не поленился, проверил.
node := doc.DocumentElement.ChildNodes['ns:Documents'].ChildNodes['ns:Document'].ChildNodes['ns:Ticket'].
ChildNodes['tc:Result'].ChildNodes['tc:Comments'];
находит и возвращает узел, но вот дальше...
NodeValue = Null.
Text = ''.
XML = '<tc:Comments xmlns:tc="http://fsrar.ru/WEGAIS/Ticket"></tc:Comments>' (read=GetXML)
HasChildNodes = True, но childnodes[0] кидает ошибку.
При этом doc.SaveToXML выдает ожидаемый результат. Что там МС наворотили в интерфейсе, хрен их знает...
...
Рейтинг: 0 / 0
Помощь с XML
    #39772125
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я и говорил сразу, DocumentElement не нужен
Код: pascal
1.
2.
  node := doc.ChildNodes['ns:Documents'].ChildNodes['ns:Document'].ChildNodes['ns:Ticket'];
  Memo1.Lines.Text := node.xml;


выдает правильный результат. А вот спуститься ниже не дает, возвращая пустой узел (а не ошибку, как ожидалось бы). Может, namespace ему не нравится?
...
Рейтинг: 0 / 0
Помощь с XML
    #39772189
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2Может, namespace ему не нравится?да. без них читается норм.

BaliЭто был приведен фрагмент XML, а не полный XML документ.может фрагмент некорректный ?
Пробел пропущен после
Код: xml
1.
xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01"



Или вот такой вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  Node := XMLDocument2.DocumentElement.ChildNodes.FindNode('Document', '').ChildNodes.FindNode('Ticket', '').
  ChildNodes.FindNode('Result', '').ChildNodes.FindNode('Comments', '');

  if Assigned(Node) then
  begin
    Memo1.Lines.Add('NodeName: ' + Node.NodeName);
    Memo1.Lines.Add('Text: ' + Node.Text);
  end;
...
Рейтинг: 0 / 0
Помощь с XML
    #39772267
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще текст XML-я тухловат. Мало того что пробел пропущен, так еще и ?xml узла нет. Я бы на месте парсера вообще на такой ввод матерился по-черному и слал юзера лесом
...
Рейтинг: 0 / 0
Помощь с XML
    #39772426
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2так еще и ?xml узла нет.Он не является обязательным
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помощь с XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]