powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Порядок следования тэгов в XML
16 сообщений из 16, страница 1 из 1
Порядок следования тэгов в XML
    #38808349
MaWr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Стоит задача формирования XML следующего вида:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<ListItem>
 <a>val1</a>
 <b>val2</b>
 <c>val3</c>
 <a>val4</a>
 <b>val5</b>
 <a>val7</a>
 <b>val8</b>
</ListItem>


Тэги a/b/c в ListItem могут идти в разном порядке. Причем порядок важен.

если делать их как:Property a As list of %String;
Property b As list of %String;
Property c As list of %String;

То они группируются.

Данная XML используется для SOAP-сервиса.

Можно ли это сделать?
Можно ли задать описанное мной в xsd-схеме?
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808420
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите пример вашего кода, как вы уже пробовали это реализовать.
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808438
MaWr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,

Я делаю SOAP-клиент для стороннего сервиса.

Визард из xsd генерит такой класс:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Class Test.ListItem Extends (%RegisteredObject, %XML.Adaptor)
{

Property A As %String(XMLNAME = "a", XMLPROJECTION = "ELEMENT") [ Collection = list ];

Property B As %String(XMLNAME = "b", XMLPROJECTION = "ELEMENT") [ Collection = list ];

Property C As %String(XMLNAME = "c", XMLPROJECTION = "ELEMENT") [ Collection = list ];

}



Чтобы добавить второй набор a/b/c приходится руками добавлять свойства:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Class Test.ListItem Extends (%RegisteredObject, %XML.Adaptor)
{

Property A As %String(XMLNAME = "a", XMLPROJECTION = "ELEMENT") [ Collection = list ];

Property B As %String(XMLNAME = "b", XMLPROJECTION = "ELEMENT") [ Collection = list ];

Property C As %String(XMLNAME = "c", XMLPROJECTION = "ELEMENT") [ Collection = list ];

Property A1 As %String(XMLNAME = "a", XMLPROJECTION = "ELEMENT") [ Collection = list ];

Property B1 As %String(XMLNAME = "b", XMLPROJECTION = "ELEMENT") [ Collection = list ];

Property C1 As %String(XMLNAME = "c", XMLPROJECTION = "ELEMENT") [ Collection = list ];

}



В этом случае можно формировать xml из 2-х наборов a/b/c.

Можно это делать без такого извращения?
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808440
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaWrПричем порядок важен.
Т.е. Вы хотите сказать, что документы:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<ListItem>
 <a>val1</a>
 <b>val2</b>
 <c>val3</c>
 <a>val4</a>
 <b>val5</b>
 <a>val7</a>
 <b>val8</b>
</ListItem>


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<ListItem>
 <a>val1</a>
 <a>val4</a>
 <a>val7</a>
 <b>val2</b>
 <b>val5</b>
 <b>val8</b>
 <c>val3</c>
</ListItem>


и например
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<ListItem>
 <a>val7</a>
 <b>val8</b>
 <a>val4</a>
 <b>val5</b>
 <a>val1</a>
 <b>val2</b>
 <c>val3</c>
</ListItem>


Для Вас являются различными?
В таком случае такой подход в корне неверный.
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808452
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaWrЧтобы добавить второй набор a/b/c приходится руками добавлять свойства:
В XML не регламентировано положение дочерних элементов внутри родительского тега, поэтому и Cache будет генерить их в произвольном порядке.
Но если, по какой то не ведомой причине, вам нужно следование тегов в определенном порядке - пишите их в ручную. Хотя объективных причин для этого нет.
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808453
MaWr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
П.С.М.,

Да, разные.

Для стороннего сервиса, к которому обращаюсь. И ничего поделать с этим я не могу.
Остается только думать, как сделать "правильнее" на своей стороне.
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808455
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaWrМожно это делать без такого извращения?Этот вариант самый простой, другой наверно вариант, это написать свой код генерации XML, и там вы сами определите порядок вывода тегов

но с другой стороны, вы никак не можете повлиять на формат XML, чтобы он стал хоть немного логичней ?
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808475
MaWr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorно с другой стороны, вы никак не можете повлиять на формат XML, чтобы он стал хоть немного логичней ?

Влиять на формат xml могу ограниченно.

Самое простое что приходит в голову - добавить в элементы a/b/c атрибут "порядковый номер", где задавать порядок следования.

А после формирования xml применять к ней xslt-трансформацию, сортирующую тэги в соответствии с этим атрибутом.
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808480
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaWrДа, разные.
В этом случае могу Вам только по сочувствовать, ибо если все действительно так, как вы описываете, с другой стороны (тот соап сервис) реализован самописный лясопед, причем не лучшего качества, соответственно что бы с ним корректно работать, вам нужно сделать такой же самописный лясопед, который формирует нужный xml.
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808520
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaWrСамое простое что приходит в голову - добавить в элементы a/b/c атрибут "порядковый номер"
Более того, при такое структуре документа, это решение и очень логичное. При наличии такого атрибута, соап-сервис мог бы правильно разбирать пришедший пакет, выбирая узлы a/b/c с одинаковым атрибутом "порядковый номер", а не отталкиваться от порядка следования узлов a/b/c в теге ListItem.
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808529
MaWr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
П.С.М.,

Если удастся убедить создателей сервиса на такое решение - так и сделаю.

Всем спасибо!
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808706
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
П.С.М.Но если, по какой то не ведомой причине, вам нужно следование тегов в определенном порядке - пишите их в ручную. Хотя объективных причин для этого нет. При той же генерации документов xml ворд и эксель порядок тегов важен.
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38808874
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaWr, вариант:
- одна коллекция (из элементов базового класса), но содержит объекты различных классов-наследников базового класса. Для каждого класса наследника можно переопределить тэг.
- Сaché по умолчанию выгружает элементы в xml в порядке обратном порядку добавлению в коллекцию.
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38809387
vassil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaWr,

Один из велосипедов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
USER>d ^xml
<?xml version="1.0" encoding="windows-1251"?>
<ListItem >
 <a >val1</a>
 <b >val2</b>
 <c >val3</c>
 <a >val4</a>
 <b >val5</b>
 <a >val6</a>
 <b >val7</b>
</ListItem>
программа xml: set at="^a.CacheTemp($j)"
 kill @at
 
 /*
 <ListItem>
 <a>val1</a>
 <b>val2</b>
 <c>val3</c>
 <a>val4</a>
 <b>val5</b>
 <a>val7</a>
 <b>val8</b>
 </ListItem>
 */
 set @at@("|ListItem|","000|a|")="val1"
 set @at@("|ListItem|","001|b|")="val2"
 set @at@("|ListItem|","002|c|")="val3"
 set @at@("|ListItem|","003|a|")="val4"
 set @at@("|ListItem|","004|b|")="val5"
 set @at@("|ListItem|","005|a|")="val6"
 set @at@("|ListItem|","005|b|")="val7"   
 set p5xml=##class(p5.Xml).%New()
 set p5xml.At=at
 set p5xml.Filename=fileName
 set sc=p5xml.WriteStream()
 
класс p5.Xml/// Метод для создания XML-файла из специально сформированной глобали
Class p5.Xml Extends %RegisteredObject [ ClassType = "", ProcedureBlock ]
{

Property At As %String(CAPTION = "Ссылка на глобаль с данными", TRUNCATE = 1);

Property Filename As %String(TRUNCATE = 1);

Property Xmlns As %String(MAXLEN = 1000) [ InitialExpression = " xmlns:xsi="" http://www.w3.org/2001/XMLSchema-instance"" xsi:noNamespaceSchemaLocation=""ДОХОД_2НДФЛ_01.XSD"""  ];

Property Data As %Stream;

Method Export() As %Status
{
  set sc=$$$OK
  set stream=##class(%File).%New(..Filename)
  set sc=stream.Open("WSN")
  if $$$ISERR(sc) quit sc
  set sc=stream.Write("<?xml version=""1.0"" encoding=""windows-1251""?>")
  if $$$ISERR(sc) quit sc
  $$$QuitOnError(..PutNode(.stream,..At,,..Xmlns))
  if $$$ISERR(sc) quit sc  
  set sc=stream.%Close()
  quit sc
}

Method WriteStream() As %Status
{
  set sc=$$$OK
  //set stream=##class(%File).%New(..Filename)
  //set sc=stream.Open("WSN")
  //if $$$ISERR(sc) quit sc
  Write "<?xml version=""1.0"" encoding=""windows-1251""?>"
  
  $$$QuitOnError(..PutNode(,..At,,..Xmlns,1))
  if $$$ISERR(sc) quit sc  
  //set sc=stream.%Close()
  quit sc
}

Method PutNode(ByRef stream As %Stream, at, indent = "", xmlns = "", isWrite = 0) As %Status [ PublicList = at ]
{
  set sc=$$$OK
  set name=$order(@at@(""))
  while name]"" {
    set xmlns=$piece(name,"|",3)
    if xmlns["^" {
      if isWrite {
        Write $c(13,10)_indent_"<"_$piece(name,"|",2)_" "_@xmlns_">"
      } else {
        set sc=stream.Write($c(13,10)_indent_"<"_$piece(name,"|",2)_" "_@xmlns_">")
      }
    } else {
      if isWrite {
        Write $c(13,10)_indent_"<"_$piece(name,"|",2)_" "_xmlns_">"
      } else {
        set sc=stream.Write($c(13,10)_indent_"<"_$piece(name,"|",2)_" "_xmlns_">")
      }
    }
    if $$$ISERR(sc) quit
    set subname=$order(@at@(name,""))
    if subname]"" {
      set subAt=$e(at,1,$length(at)-1)_","""_name_""")"
      set subxmlns = $piece(subname,"|",3)
      
      if subxmlns["^" {
        if isWrite {
          set sc=..PutNode(,subAt,indent_" ",@subxmlns,1)
        } else {
          set sc=..PutNode(.stream,subAt,indent_" ",@subxmlns)
        }
      }else {
        if isWrite {
          set sc=..PutNode(,subAt,indent_" ",subxmlns,1)
        } else {
          set sc=..PutNode(.stream,subAt,indent_" ",subxmlns)
        }
      }
      if $$$ISERR(sc) quit
    }
    set value=$get(@at@(name))
    if isWrite {
      if value]"" Write value
      if subname]"" Write $c(13,10)_indent_"</"_$piece(name,"|",2)_">"
      else  Write "</"_$piece(name,"|",2)_">"
    } else {
      if value]"" set sc=stream.Write(value)
      if $$$ISERR(sc) quit
      if subname]"" set sc=stream.Write($c(13,10)_indent_"</"_$piece(name,"|",2)_">")
      else  set sc=stream.Write("</"_$piece(name,"|",2)_">")
    }
    if $$$ISERR(sc) quit
    set name=$order(@at@(name))
  }
  quit sc
}

}
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38809478
D_De1mos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vassilMaWr,

Один из велосипедов:

Если уже в таком виде решается задача, то, мне кажется, удобнее будет использовать класс %XML.Writer. Чтобы хотя бы с тэгами не заморачиваться.
...
Рейтинг: 0 / 0
Порядок следования тэгов в XML
    #38810512
vassil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D_De1mos,

Код писался очень давно и с помощью %XML.Writer не получалось получить файл требуемого вида. Уже не помню по каким причинам. Возможно, в новых версиях cache такой проблемы уже нет.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Порядок следования тэгов в XML
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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