获取XML片段并再次将其显示为XML

获取XML片段并再次将其显示为XML,xml,abap,Xml,Abap,我正在寻找从XML文件中提取零件的可能性。文件按名称上载到程序,文本可能会有所不同,但结构和节点将保持不变。XML如下所示: <?xml version="1.0" encoding="UTF-8"?> <n0:Content> <n1:Subnode1> <n1:Subnode2> <n1:Subnode3> <n1:Subnode4 xml:lan

我正在寻找从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>

文本(英文)

文本(IT)

文本(FR)

这就是上传到报告中的XML的结构。我想按lang=“”提取,只显示标题中的确切部分
再次作为XML。 因此,在我决定使用例如“en”之后,输出应该如下所示:


文本(英文)


一段时间以来,我一直在尝试寻找一些有用的东西,所以我真的很感谢你的一些意见。多谢各位

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>
将结果保存在
XSD
文件中,比如
text\u source.XSD

对结果(目标)XML重复相同的操作

将结果保存在
XSD
文件中,比如
en_text_destination.XSD

代理对象生成数据字典

生成数据字典。我使用的是
SPROX\u XSD2PROXY
程序(如果经常使用,您可以使用
SE93
中的事务将其包装,我称之为
ZXSD\u GEN
)。参数包括:

  • 提到的
    XSD
    文件的完整路径,例如
    d:\schemas\text.XSD
  • 符合前缀的包(
    zsomthing
    /something/
  • 前缀
    zsomthing\u其他somthing
    /something/anothersomthing
  • 选中激活复选框
  • 对结果(目标)
    XSD
    重复相同的操作

    节目

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

  • 阅读
  • 转化
  • 执行
  • 阅读

    从任何地方获取XML数据,然后将其作为
    XSTRING
    返回

    转化

    调用
    CL_PROXY_XML_TRANSFORM=>XML_XSTRING_TO_ABAP
    方法

    参数:

    DDIC\u TYPE
    -在数据字典生成部分中生成的代理对象的源根结构的名称。
    XML
    -读取XML数据。
    ABAP\u数据
    -
    ls\u源
    th

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

    调用
    CL_PROXY_XML_TRANSFORM=>ABAP_TO_XML_XSTRING
    方法

    参数:

    ABAP\u数据
    -
    ls\u dest

    DDIC\u TYPE
    -在数据字典生成部分中生成的代理对象的根结构的名称

    返回
    XML
    结果(
    XSTRING

    将XML数据保存到任意位置

    执行


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

    ,这里有一个专门使用iXML的解决方案(与使用XSLT转换相比,这非常复杂,正如Jagger所说)

    只有在声明了名称空间(xmlns:prefix=“URI”)的情况下,iXML才能处理具有名称空间的节点

    一旦对DOM树的更改导致未声明(或在其声明范围之外使用)命名空间前缀,iXML就会引发错误

    因此,您的XML应该具有如下名称空间声明,以便它是一个有效的XML(如Dorad所说),并且可以由iXML解析,并且注意,
    xmlns:n1=…
    也可以在
    中移动:

    结果:

    关于代码的注释:

    • 有一个方法
      get\u namespace\u context
      但没有专门用于“设置名称空间上下文”,这就是为什么使用方法
      set\u attribute\u ns
      来设置
      xmlns
      属性的原因
    • 为了简化代码,我直接在原始元素中设置了所有
      xmlns
      属性,而不是第一次克隆;我最好先完成
      数据(lou新元素)=lou元素->克隆()
      ,然后只更改lou新元素
    • iXML不将XML头作为iXML节点来处理,有特定的方法来初始化它,因此我使用方法
      set\u version
      set\u encoding
    • 我使用了
      if_ixml_document_fragment
      类型的虚拟节点,因为新文档的根只能是从该文档本身创建的节点,即不可能将
      lo_元素
      (从原始文档)设置为新文档的根
    • 为了简化演示,我没有处理错误

    它“有点”宽泛,有许多XML库。你能告诉我们你尝试了什么吗?你可能成功了,至少部分成功了,不是吗?我成功地上传了XML,我创建了一个streamfactory并解析了它。我已经找到了带有“->find\u from\u name”的东西,但我不确定到底找到了什么。与我的主管交谈时,他说我应该与另一家工厂合作,根据
    <?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 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>
    
    DATA: ls_source, ls_dest.  "a data of the root structure type of source XML
    
    <?xml ...?>
    <n0:Content xmlns:n0="http://www.yourspace.com/n0" xmlns:n1="http://www.yourspace.com/n1">
      <n1:Subnode1>
        ...
    </n0:Content>
    
    <?xml ...?>
    <n1:Subnode4 xmlns:n1="http://www.yourspace.com/n1" xml:lang="en">
        ...
    </n1:Subnode4>
    
    DATA(xmlstr) = `<?xml version="1.0" encoding="utf-8"?>`
    && `<n0:Content xmlns:n0="http://n0" xmlns:n1="http://n1">`
    && `  <n1:Subnode1>`
    && `    <n1:Subnode4 xml:lang="en"><p style="texttext"><b>Text (EN)</b></p></n1:Subnode4>`
    && `    <n1:Subnode4 xml:lang="it"><p style="texttext"><b>Text (IT)</b></p></n1:Subnode4>`
    && `    <n1:Subnode4 xml:lang="fr"><p style="texttext"><b>Text (FR)</b></p></n1:Subnode4>`
    && `  </n1:Subnode1>`
    && `</n0:Content>`.
    
    DATA lo_document TYPE REF TO if_ixml_document.
    CALL FUNCTION 'SDIXML_XML_TO_DOM'
      EXPORTING xml      = cl_proxy_service=>cstring2xstring( xmlstr )
      IMPORTING document = lo_document.
    
    DATA(lo_element) = CAST if_ixml_element( lo_document->create_iterator_filtered(
                       lo_document->create_filter_attribute_ns( name = 'lang'
                       value = 'en' uri = 'xml' ) )->get_next( ) ).
    DATA(lo_xmlns) = lo_element->get_namespace_context( ).
    DATA(i) = 1.
    WHILE i <= lo_xmlns->num_bindings( ) AND lo_xmlns->get_binding_prefix( i ) IS NOT INITIAL.
      lo_element->set_attribute_ns( prefix = 'xmlns'
            name = lo_xmlns->get_binding_prefix( i ) value = lo_xmlns->get_binding_uri( i ) ).
      i = i + 1.
    ENDWHILE.
    
    DATA(lo_new_document) = cl_ixml=>create( )->create_document( ).
    lo_new_document->set_version( lo_document->get_version( ) ).
    lo_new_document->set_encoding( lo_document->get_encoding( ) ).
    
    DATA(lo_fragment) = lo_new_document->create_document_fragment( ).
    lo_fragment->append_child( lo_element ).
    lo_new_document->append_child( lo_fragment ).
    
    DATA(lo_doc) = NEW cl_xml_document( ). lo_doc->create_with_dom( lo_new_document ).
    lo_doc->display( ).