|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
Добрый день. Стоит задача формирования XML следующего вида: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
Тэги 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-схеме? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 14:21 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
Приведите пример вашего кода, как вы уже пробовали это реализовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 14:59 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
DAiMor, Я делаю SOAP-клиент для стороннего сервиса. Визард из xsd генерит такой класс: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Чтобы добавить второй набор a/b/c приходится руками добавлять свойства: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
В этом случае можно формировать xml из 2-х наборов a/b/c. Можно это делать без такого извращения? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 15:08 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
MaWrПричем порядок важен. Т.е. Вы хотите сказать, что документы: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
и например Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
Для Вас являются различными? В таком случае такой подход в корне неверный. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 15:09 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
MaWrЧтобы добавить второй набор a/b/c приходится руками добавлять свойства: В XML не регламентировано положение дочерних элементов внутри родительского тега, поэтому и Cache будет генерить их в произвольном порядке. Но если, по какой то не ведомой причине, вам нужно следование тегов в определенном порядке - пишите их в ручную. Хотя объективных причин для этого нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 15:13 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
П.С.М., Да, разные. Для стороннего сервиса, к которому обращаюсь. И ничего поделать с этим я не могу. Остается только думать, как сделать "правильнее" на своей стороне. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 15:13 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
MaWrМожно это делать без такого извращения?Этот вариант самый простой, другой наверно вариант, это написать свой код генерации XML, и там вы сами определите порядок вывода тегов но с другой стороны, вы никак не можете повлиять на формат XML, чтобы он стал хоть немного логичней ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 15:13 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
DAiMorно с другой стороны, вы никак не можете повлиять на формат XML, чтобы он стал хоть немного логичней ? Влиять на формат xml могу ограниченно. Самое простое что приходит в голову - добавить в элементы a/b/c атрибут "порядковый номер", где задавать порядок следования. А после формирования xml применять к ней xslt-трансформацию, сортирующую тэги в соответствии с этим атрибутом. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 15:21 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
MaWrДа, разные. В этом случае могу Вам только по сочувствовать, ибо если все действительно так, как вы описываете, с другой стороны (тот соап сервис) реализован самописный лясопед, причем не лучшего качества, соответственно что бы с ним корректно работать, вам нужно сделать такой же самописный лясопед, который формирует нужный xml. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 15:21 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
MaWrСамое простое что приходит в голову - добавить в элементы a/b/c атрибут "порядковый номер" Более того, при такое структуре документа, это решение и очень логичное. При наличии такого атрибута, соап-сервис мог бы правильно разбирать пришедший пакет, выбирая узлы a/b/c с одинаковым атрибутом "порядковый номер", а не отталкиваться от порядка следования узлов a/b/c в теге ListItem. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 15:49 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
П.С.М., Если удастся убедить создателей сервиса на такое решение - так и сделаю. Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 16:02 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
П.С.М.Но если, по какой то не ведомой причине, вам нужно следование тегов в определенном порядке - пишите их в ручную. Хотя объективных причин для этого нет. При той же генерации документов xml ворд и эксель порядок тегов важен. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 18:31 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
MaWr, вариант: - одна коллекция (из элементов базового класса), но содержит объекты различных классов-наследников базового класса. Для каждого класса наследника можно переопределить тэг. - Сaché по умолчанию выгружает элементы в xml в порядке обратном порядку добавлению в коллекцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2014, 22:09 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
MaWr, Один из велосипедов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
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 } } ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2014, 12:54 |
|
Порядок следования тэгов в XML
|
|||
---|---|---|---|
#18+
vassilMaWr, Один из велосипедов: Если уже в таком виде решается задача, то, мне кажется, удобнее будет использовать класс %XML.Writer. Чтобы хотя бы с тэгами не заморачиваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2014, 13:35 |
|
|
start [/forum/topic.php?fid=39&msg=38808453&tid=1556767]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 273ms |
total: | 430ms |
0 / 0 |