获取XML片段并再次将其显示为XML
我正在寻找从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 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
重复相同的操作
节目
您可以使用具有四种方法的类来实现它:
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 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( ).