|
|
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Hi All, Delphi 10.3.3 Разбор XML делаю с помощью TXMLDocument. Какие то стороние компоненты для этого задействовать бы не хотелось. Есть такой XM (упрощенной вариант): Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Есть xsd файл для валидации этого xml. 1) Поддерживает ли валидация xml через xsd порядок следования нод ? Например в указанной выше xml сначала идет RegNumber, а потом Confident. Если я их поменяю местами, то может ли xsd это выявить ? 2) В этой xml есть два нода DocTransfer, но может быть и один. Как вообще лучше правильно организовать разбор такой xml, в которой могут быть на одном уровне одинаковые имена нод (DocTransfer) и на этом же уровне есть ноды с другими именами (RegNumber,Confident,Writer) ? Организовать цикл по Document.ChildNodes внутри которого получив очередной нод, смотреть его имя и уже потом вычитывать данные ? Но тогда может быть много вложенных циклов, скажем в моем примере их будет 2: по Document и по Writer, это усложнит код. Хотя если порядок следования нод гарантированный, то можно задействовать метод NextSibling (получения следующей ноды текущего уровня). Или может есть другие варианты ? Меня смущает именно наличие на одном уровне одинаковые имен нод, вместе с другими именами нод на этом же уровне ... 3) Как с помощью TXMLDocument добавить к XML заголовок вида '<?xml version="1.0" encoding="utf-8"?>' ? Просто сделать TXMLDocument XML.Insert(0, '') или как то по другому ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2020, 13:09 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Stalker4, IXMLDOMDocument кажется мне поинтереснее... читать здесь https://www.amazon.com/Delphi-Developers-Guide-XML-2nd/dp/1591098629 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2020, 13:25 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Насколько я знаю, xml не определяет порядок следования узлов. Касательно одноименных узлов - у тебя получается кашеобразная структура внутри Document за счет гибкости xml. Надо либо обвязывать ее дополнительной прокладкой в коде для представления в удобных структурах Delphi, либо формализовать структуру xml. Например, помещать все узлы DocTransfer в узел-контейнер DocTransfers, даже если DocTransfer всего один. Все зависит от того, насколько ты можешь менять формат xml и какие действия с ним нужны в программе. К примеру, если только читать, то можно и не мудрить со структурой, а в программе работать с классом-посредником. Если же надо и записывать, то чем строже структура xml, тем будет легче и более ошибкоустойчиво ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2020, 13:50 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Василий 2 Насколько я знаю, xml не определяет порядок следования узлов. Я для интереса, взял эту xml и ее xsd. Сделал валидацию, все OK. Поменял местами RegNumber и Confident, валидация заругалась Validation of current file using XML schema: ERROR: Element 'Confident': This element is not expected. Expected is ( RegNumber ).То есть какая то проверке порядка следования нод по xsd все же есть. Василий 2 Касательно одноименных узлов - у тебя получается кашеобразная структура внутри Document за счет гибкости xml. Мне ее надо и читать (то что мне пришлют) и писать (создание этой xml со своими данными). Василий 2 а в программе работать с классом-посредником. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2020, 14:48 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Stalker4 1) Поддерживает ли валидация xml через xsd порядок следования нод ? Stalker4 2) В этой xml есть два нода DocTransfer, но может быть и один. Код: xml 1. Stalker4 Но тогда может быть много вложенных циклов, Stalker4 3) Как с помощью TXMLDocument добавить к XML заголовок вида '<?xml version="1.0" encoding="utf-8"?>' ? Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2020, 14:54 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Stalker43) Как с помощью TXMLDocument добавить к XML заголовок вида '<?xml version="1.0" encoding="utf-8"?>' ? Код: pascal 1. 2. 3. 4. 5. 6. А еще лучше Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2020, 14:59 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Stalker4 1) Поддерживает ли валидация xml через xsd порядок следования нод ? Есть еще такой вопрос. После разбора этой xml, с ее данными надо произвести определенную объемную работу. Для того, что бы с ними было удобно работать, их желательно сохранить в некие структуры. Я вижу два варианта: 1) Создается связка record, элементы которых могут быть как простого типа, так и типа других record или типа array of record для множественных элементов. 2) Создается связка классов, простых классов и классов коллекций для множественных элементов. в.1 проще в написании связки, но сложнее в заполнении ее данными. в.2 - наоборот. Может есть еще варианты ? Что лучше выбрать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2020, 16:19 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Stalker4 в.1 проще в написании связки, но сложнее в заполнении ее данными. в.2 - наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2020, 16:56 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Stalker4 Что Вы имеете ввиду под классом-посредником ? Некий класс, который бы прятал детали работы с xml и выставлял наружу, например, DocTransfers: array of DocTransfer и Writers: array of Writer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2020, 17:53 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Добавлю свои 5 центов. Есть такая библиотека https://github.com/benibela/internettools на FreePascal Сделал REST сервис : на входе XQUERY и XML файл, на выходе JSON. А уже в Delphi превращать JSON в класс с помощью https://github.com/JensBorrisholt/Delphi-JsonToDelphiClass Правда, до продакшена еще дело не дошло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2020, 18:52 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
AlexeyM123 А уже в Delphi превращать JSON в класс с помощью https://github.com/JensBorrisholt/Delphi-JsonToDelphiClass ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2020, 09:29 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Stalker4 AlexeyM123 А уже в Delphi превращать JSON в класс с помощью https://github.com/JensBorrisholt/Delphi-JsonToDelphiClass http://docwiki.embarcadero.com/RADStudio/Rio/en/Using_the_XML_Data_Binding_Wizard ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2020, 09:48 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
zinpub Stalker4 пропущено... Интересно, а нет ли такого же но для XML, что то типа XMLToDelphiClass ? http://docwiki.embarcadero.com/RADStudio/Rio/en/Using_the_XML_Data_Binding_Wizard ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2020, 12:28 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Stalker4 Нет у меня (Delphi 10.3.3. Enterprise) там такого. Можно картинку, где оно находиться ? File -> New -> Other... -> Web -> XML Data Binding А вообще в индексе справки можно набрать XML Data Binding. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2020, 12:38 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ _Vasilisk_ пропущено... Код: pascal 1. 2. 3. 4. 5. 6. Код: pascal 1. 2. Попробовал оба варианта. В обоих случаях есть проблема. Создал тестовый код: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. В случае "XMLDocument1.SaveToFile" я получаю XML как и ожидал: Код: xml 1. 2. А в случае "XMLDocument1.SaveToXML" или "XMLDocument1.XML.SaveToFile" я почему то получаю XML без указания кодировки: Код: xml 1. 2. Как это исправить ? Особенно мне важен метод SaveToXML, так как он возвращает XML в виде строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2020, 15:24 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Stalker4 А в случае "XMLDocument1.SaveToXML" или "XMLDocument1.XML.SaveToFile" я почему то получаю XML без указания кодировки: Код: 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. Т.к. строка сама по себе уже в какой-то кодировке (ANSI/UTF-16) то указывать кодировку в самом XML было бы обманом Stalker4 Особенно мне важен метод SaveToXML, так как он возвращает XML в виде строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2020, 17:22 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
В большой программе есть такой код Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. cXML это переменная типа String в которой находится большой XML (83 мб) загруженный из интернет-сервиса SOAP. Так вот, на строке FXMLDocument.Active := True я получаю ошибку Код: plaintext В ходе попыток победить эту проблему заменил строку FXMLDocument.XML.LoadFromStream(oXMLStream, TEncoding.UTF8); на FXMLDocument.LoadFromStream(oXMLStream, xetUTF_8); и все отработало нормально. Вопрос: Не совсем понятно, в чем принципиальное отличие загрузки XML между FXMLDocument.XML.LoadFromStream и FXMLDocument.LoadFromStream ? И какой вариант все же лучше (правильней) использовать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2021, 14:43 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Вообще TEncoding сделан очень тупо и в пике может пожирать что-то около х4 или х5 от исходных данных. Хотя 80 мегов должен прожевать... хз, попробуй трассировку. А второй метод, скорее всего, кодирует более оптимально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2021, 14:50 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
Предлагаю перестать в произвольные места вставлять TEncoding.UTF8, а прочитать документацию или посмотреть исходники ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2021, 14:55 |
|
||
|
Несколько вопросов по парсингу XML
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Предлагаю перестать в произвольные места вставлять TEncoding.UTF8, а прочитать документацию _Vasilisk_ или посмотреть исходники Так все таки какой метод лучше использовать FXMLDocument.XML.LoadFromStream или FXMLDocument.LoadFromStream ? Убрал в своем примере FXMLDocument.XML.LoadFromStream параметр TEncoding.UTF8, FXMLDocument смог отпарсить больший кусок XML, но полностью все равно не смог ... Может это какие то ограничения самого IXMLDocument на размер XML с которым он может работать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2021, 15:45 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39919588&tid=2037699]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
151ms |
get topic data: |
8ms |
get forum data: |
4ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 474ms |

| 0 / 0 |
