首页 > 解决方案 > 获取 XML 片段并再次显示为 XML

问题描述

我正在寻找一种从 XML 文件中提取一部分的可能性。文件按名称上传到程序,文本可能会有所不同,但结构和节点将保持不变。XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<n0:Content>
    <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 的结构。我想通过 lang="" 提取,并且仅将带有标头的确切部分 <?xml version="1.0" encoding="UTF-8"?>再次显示为 XML。因此,在我决定使用例如“en”之后,输出应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
            <n1:Subnode4 xml:lang="en">
                    <head></head>
                    <body>
                        <p style="texttext">
                            <b>Text (EN)</b>
                        </p>
                    </body>
            </n1:Subnode4>

一段时间以来,我一直在尝试寻找有用的东西,所以我非常感谢一些输入。谢谢你。

标签: xmlabap

解决方案


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 生成

XSD从中生成一个(使用这样的工具)。可能的结果:

<?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)。参数是:

  1. 提到的XSD文件的完整路径,比如d:\schemas\texts.xsd.
  2. 符合前缀 (zsomthing/something/) 的包。
  3. 前缀zsomthing_anothersomthing/something/anothersomthing
  4. 检查激活复选框

对结果(目的地)重复相同的操作XSD

程序

您可以使用具有四种方法的类来实现它:

  1. 转换
  2. 执行

从任何地方获取您的 XML 数据,然后将其作为XSTRING.

转换

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

通过填充目标根结构进行所需的操作。

调用CL_PROXY_XML_TRANSFORM=>ABAP_TO_XML_XSTRING方法

参数:

ABAP_DATA-ls_dest

DDIC_TYPE- 您在代理对象中生成的目标根结构的名称数据字典生成部分。

返回XML结果 ( XSTRING)

将您的 XML 数据保存到任何地方。

执行

调用READ,然后将其结果传递给TRANSFORM,然后将其结果传递给WRITE


推荐阅读