xmlDOMGet
Version 24.3.9111
Version 24.3.9111
xmlDOMGet
从 XML 文件获取值。
必需的参数
- map:*: 一组一个或多个输入,其中映射参数的名称位于冒号之前(例如
map:foo
),并且值是文档中所需 xml 元素的 xpath。 有关详细信息,请参阅示例。
可选的参数
- uri: XML 文件 URI。 这可以是动态文件引用,例如输入文件的
FilePath
、磁盘上的静态文件路径或 XML 文件的公共 URL。 - handle: 对 XML 数据的可读句柄引用。 该句柄由 xmlOpen 操作创建,仅当目标 XML 不是输入文件时才需要。 有关详细信息和示例,请参阅 xmlOpen。
- repeatelement#: 文档中重复的元素的 xpath。
- repeatmode: 定义
repeatelement#
值存储在输出项上的方式。 允许的值为ITEM
和ARRAY
。 当设置为ITEM
(默认值)时,从重复元素找到的值将作为单独的属性存储在操作生成的每个输出项上。 当设置为ARRAY
时,从重复元素找到的值将作为数组属性存储在单个输出项上,并且需要通过其基于 1 的索引进行访问(例如,[result.color#2]
将引用 到结果项的color
属性中的第二个值)。
输出属性
- *: 使用map参数映射的XML元素的输出值。 通过引用输出项和映射输入项的名称(例如
[results.foo]
)来访问它们。 输出项的名称(在本例中为results
)由用户确定。 有关其他上下文,请参阅示例。
示例
从 XML 文档中检索值
考虑以下的 XML 数据,它作为输入数据传递给知行之桥的 Script 端口:
<Items>
<Car>
<Make>Subaru</Make>
<Model>WRX</Model>
</Car>
</Items>
在该 Script 端口中,你可以在 ArcScript 中调用 xmlDOMGet 从 XML 数据中获取 car 中的 make
和 model
值,并把它们作为消息头添加到知行之桥的消息中。下面的 ArcScript 示例代码展示了如何实现这一点:
<!-- 设置输入uri和map参数-->
<arc:set attr="xml.uri" value="[FilePath]" />
<arc:set attr="xml.map:make" value="/Items/car/make" />
<arc:set attr="xml.map:model" value="/Items/car/model" />
<!-- 调用操作,传入xml项并创建“结果”输出项-->
<arc:call op="xmlDOMGet" in="xml" out="result">
<!-- result.make 和 result.model 具有 xpath 的值,因为 map:make 和 map:model 是
设置在操作的输入中,结果是输出项的名称。 一旦这个
op 关闭,结果超出范围,因此请在 arc:call 块内使用您的值 -->
<!-- 将品牌和型号的值设置为消息的消息头 -->
<arc:set attr="output.header:carmake" value="[result.make]" />
<arc:set attr="output.header:carmodel" value="[result.model]" />
</arc:call>
<!-- 设置输出文件并推送文件 -->
<arc:set attr="output.filepath" value="[FilePath]" />
<arc:push item="output" />
该代码执行后,知行之桥将带有新添加的消息头的文件作为输出向下推送到工作流中。
使用索引访问特定的重复 XML 元素
用户经常需要访问特定的重复 XML 元素。 例如,可能想要访问以下 XML 中存在的第二个order
的id
,该 XML 作为输入文件传递到脚本端口。
<Items>
<orders>
<order>
<date>02/27/2023</date>
<id>1234</id>
</order>
<order>
<date>02/28/2023</date>
<id>5678</id>
</order>
<order>
<date>03/01/2023</date>
<id>9876</id>
</order>
</orders>
</Items>
在脚本端口中,可以在 ArcScript 中调用 xmlDOMGet 来使用重复的<orders>
元素之一中存在的元素的基于 1 的 xpath 来访问特定订单的id
。 以下 ArcScript 代码显示了如何执行此操作的示例。
<!-- 设置输入uri和map参数-->
<arc:set attr="xml.uri" value="[FilePath]" />
<arc:set attr="xml.map:orderid" value="/Items/orders/order\[2\]/id" />
<!-- 调用操作,传入xml项并创建“结果”输出项-->
<arc:call op="xmlDOMGet" in="xml" out="result">
<!-- 将映射的 id 参数的结果设置为消息的消息头 -->
<arc:set attr="output.header:orderid" value="[result.orderid]" />
</arc:call>
<!-- 设置输出文件并推送文件 -->
<arc:set attr="output.filepath" value="[FilePath]" />
<arc:push item="output" />
使用repeatelement参数
考虑下面的 XML 数据,该数据作为输入文件传递到 Script 端口:
<Items>
<hello>world</hello>
<colors>
<color>yellow</color>
<example>banana</example>
</colors>
<colors>
<color>red</color>
<example>apple</example>
</colors>
<colors>
<color>orange</color>
<example>orange</example>
</colors>
</Items>
在脚本端口内,针对输入文件执行以下代码。 repeatelement#
参数用于定义具有重复值的元素。 在此示例中,color
和example
值在/Items/colors
XML 元素中重复。 当设置repeatelement#
时,xmlDOMGet 操作将循环遍历该元素中存在的值。
repeatmode
参数定义repeatelement#
值存储为输出的方式。 当设置为ITEM
(默认值)时,重复元素找到的值将作为单独的属性存储在输出项上。 当设置为ARRAY
时,重复元素找到的值将作为数组属性存储在输出项上,并且需要通过基于 1 的索引进行访问(例如,[result.color#2]
将解析为 red
和 result.example#2
将解析为 apple
)。
<!-- 初始化输出数据-->
<arc:set attr="out.data" />
<!-- 设置输入uri、repeatmode和map参数-->
<arc:set attr="xml.uri" value="[FilePath]" />
<arc:set attr="xml.repeatelement#" value="/Items/colors" />
<arc:set attr="xml.repeatmode" value="ITEM" />
<!-- 注意,映射的值是相对于重复元素路径的 -->
<arc:set attr="xml.map:color" value="color" />
<arc:set attr="xml.map:example" value="example" />
<!-- 调用操作,传入xml项并创建“结果”输出项-->
<arc:call op="xmlDOMGet" in="xml" out="result">
<!-- 将输出数据设置为调用的枚举结果-->
<arc:set attr="out.data">[out.data]
<arc:enum list="color,example" separator=",">[_value]: [result.[_value]]\n
</arc:enum>
</arc:set>
</arc:call>
<!-- 设置输出文件名并推送文件 -->
<arc:set attr="out.filename" value="data.txt" />
<arc:push item="out" />
Output file:
color: yellow
example: banana
color: red
example: apple
color: orange
example: orange