xml - 获取 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>
一段时间以来,我一直在尝试寻找有用的东西,所以我非常感谢一些输入。谢谢你。
解决方案
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
)。参数是:
- 提到的
XSD
文件的完整路径,比如d:\schemas\texts.xsd
. - 符合前缀 (
zsomthing
或/something/
) 的包。 - 前缀
zsomthing_anothersomthing
或/something/anothersomthing
- 检查激活复选框
对结果(目的地)重复相同的操作XSD
。
程序
您可以使用具有四种方法的类来实现它:
- 读
- 转换
- 写
- 执行
读
从任何地方获取您的 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
。
推荐阅读
- swift - SwiftUI:如何将图像转换为 jpeg 数据?
- snowflake-cloud-data-platform - 雪花舞台 - 看不到
- django - django.core.exceptions.ValidationError: [''] on Datefiled - Resolvido
- reactjs - 类型 'string[]' 不能分配给类型 'never[]'
- c# - 从 swagger UI 的标头中传递 Jwt 令牌作为不记名令牌不起作用
- python - 在 Python Pandas 中组合 datafames
- reactjs - 如何将已经构建的带有 express.js 后端的 react 应用程序部署到 heroku
- c++ - 如何合并从函数返回的向量?
- c# - 在其他线程中触发事件后在事件处理程序中更新 UI 的最佳方法
- python - 使用 concurrent.futures.ProcessPoolExecutor 在 Python 中进行多处理