1.Проверьте XML
Сделайте ваш XML действительным.вот один из вариантов:
<?xml version="1.0" encoding="UTF-8"?>
<n0:Content xmlns:n0="http://www.yourspace.com/n0" xmlns:n1="http://www.yourspace.com/n1" xmlns:n2="http://www.yourspace.com/n1">
<n1:Subnode1>
<n1:Subnode2>
<n1:Subnode3>
<n1:Subnode4 xml:lang="en">
<head></head>
<body>
<p style="texttext">
<b>Text (EN)</b>
</p>
</body>
</n1:Subnode4>
<n1:Subnode4 xml:lang="it">
<head></head>
<body>
<p style="texttext">
<b>Text (IT)</b>
</p>
</body>
</n1:Subnode4>
<n1:Subnode4 xml:lang="fr">
<head></head>
<body>
<p style="texttext">
<b>Text (FR)</b>
</p>
</body>
</n1:Subnode4>
</n1:Subnode3>
</n1:Subnode2>
</n1:Subnode1>
</n0:Content>
Повторите то же самое для результата (назначения) XML
.
XSD Generation
Генерируйте XSD
из него (используя такие инструменты, как this ).Возможный результат:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- XML Schema Generated from XML Document on Thu Mar 21 2019 16:04:11 GMT+0200 (Israel Standard Time) -->
<!-- with XmlGrid.net Free Online Service http://xmlgrid.net -->
<xs:element name="n0:Content">
<xs:complexType>
<xs:sequence>
<xs:element name="n1:Subnode1">
<xs:complexType>
<xs:sequence>
<xs:element name="n1:Subnode2">
<xs:complexType>
<xs:sequence>
<xs:element name="n1:Subnode3">
<xs:complexType>
<xs:sequence>
<xs:element name="n1:Subnode4" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="head"></xs:element>
<xs:element name="body">
<xs:complexType>
<xs:sequence>
<xs:element name="p">
<xs:complexType>
<xs:sequence>
<xs:element name="b" type="xs:string"></xs:element>
</xs:sequence>
<xs:attribute name="style" type="xs:string"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="xml:lang" type="xs:string"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="xmlns:n0" type="xs:string"></xs:attribute>
<xs:attribute name="xmlns:n1" type="xs:string"></xs:attribute>
<xs:attribute name="xmlns:n2" type="xs:string"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>
Сохраните результаты в файле XSD
, скажем texts_source.xsd
.
Повторите то же самое для XML результата (назначения).
Сохраните результаты в файле XSD
, скажем, en_text_destination.xsd
.
Прокси-объект для создания словаря данных
Сгенерируйте прокси-объект и данныетолковый словарь.Я делаю это с помощью программы SPROX_XSD2PROXY
(если это делается часто, вы можете заключить ее в транзакцию в SE93
, я назвал ее ZXSD_GEN
).Параметры:
- Полный путь к указанному файлу
XSD
, скажем d:\schemas\texts.xsd
. - Пакет, который соответствует префиксу (
zsomthing
или /something/
). - Префикс
zsomthing_anothersomthing
или /something/anothersomthing
- Установите флажок активации
Повторите то же самое для результата (пункт назначения) XSD
.
Программа
Вы можете реализовать ее с помощью класса с четырьмя методами:
- READ
- TRANSFORM
- WRITE
- ВЫПОЛНИТЬ
ЧИТАТЬ
Получить данные XML из любого места, а затем вернуть их как XSTRING
.
TRANSFORM
DATA: ls_source, ls_dest. "a data of the root structure type of source XML
Вызов метода CL_PROXY_XML_TRANSFORM=>XML_XSTRING_TO_ABAP
.
Параметры:
DDIC_TYPE
- имя корневой структуры источника, сгенерированного в Прокси-объект, секция словаря данных раздел.XML
- чтение данных XML.ABAP_DATA
- ls_source
th
Выполните необходимые манипуляции, заполнив целевую корневую структуру.
Вызов CL_PROXY_XML_TRANSFORM=>ABAP_TO_XML_XSTRING
Метод
Параметры:
ABAP_DATA
- ls_dest
DDIC_TYPE
- имя корневой структуры места назначения, которое вы генерируете в Прокси-объект, секция словаря данных section.
return XML
результаты (XSTRING
)
НАПИСАТЬ
Сохранить данные XML в любом месте.
ВЫПОЛНИТЬ
Позвоните READ
, затем передайте его результаты TRANSFORM
, затем передайте его WRITE
.