XML 解析
XML 解析 步骤读取源表某一列中保存的 XML,并将其转换为行。对于每个输入行,它会找到您指定的元素的每一次出现,并为每个匹配项输出一行,同时把该元素的属性和子标签的值投影到列上。
它相当于 Alteryx 的 XML Parse 工具。解析在工作流引擎中运行(数据库无法在 SQL 中解析 XML),因此该步骤是 PlaidCloud 原生的,没有 SQL 回退方案。
- 源表 — 其行中保存要解析的 XML 的表。
- 输出表 — 写入解析后各行的表。
- XML 字段 — 保存 XML 文本的列。
- 元素 — 其每一次出现都会成为一个输出行的元素。留空则解析顶级元素。
- 将元素作为 XPath 1.0 表达式读取 — 将 元素 视为 XPath 1.0 表达式而不是名称,因此可以使用谓词、属性测试、通配符,以及
count()、name()和contains()等函数。相对路径从文档的根元素开始。表达式选中的每个项都会成为一个输出行。元素按常规方式解析。任何其他项(例如属性或count()的结果)会在其所在行中用自身的值替换 XML 字段 的值;开启子元素的值时,选中的属性则会获得一个与其同名的单独列。读取 XML 时会关闭实体和网络访问,格式不正确的文档会使步骤失败,除非您跳过这类行。 - 将子元素的值输出为列 — 对于每个匹配的元素,为每个子标签添加一列,保存该子元素的值。
- 输出每个子元素的外部 XML — 另外添加一个
<tag>_OuterXML列,保存每个子元素序列化后的 XML(当子元素本身嵌套了更多要在后续步骤中解析的 XML 时很有用)。 - 跳过 XML 无法解析的行 — 当输入行的值不是格式正确的 XML 时,丢弃该行,而不是使步骤失败。
将 XML 转换为 JSON
Section titled “将 XML 转换为 JSON”输出 用于选择每个文档变成什么:
- 列(默认)— 将解析出的值放入列中,如下所述进行设置。
- 元素为 JSON — XML 字段 中的每个文档都被替换为其 JSON 文本,每个输入行对应一个输出行。属性变为
@字段,元素自身的文本变为#text,重复的子元素变为数组。元素、子元素的值、外部 XML 和 XPath 选项被禁用;跳过 XML 无法解析的行 仍然适用。
要使 JSON 带有类型化的值,请将 Detect Value Types From First N Documents 设置为文档数量。这样,JSON 将包含根的子元素,每个子元素根据前面这么多个文档确定类型,类型可以是整数、小数、布尔值、日期、时间戳或文本,并加宽到适合这些文档中的每一个,这与 Spark 的 schema_of_xml 的推断方式相同。这些文档中没有的字段会被省略,无法读取为其类型的值为 null。设置为 0 时,所有值都保持为文本。
XPath 列
Section titled “XPath 列”XPath 查询 部分的工作方式与 KNIME 的 XPath 节点相同。向 查询 (xpaths) 添加行:不再为每个元素生成一行,而是复制每个输入行,并针对 XML 字段 中的 XML,为每个 XPath 1.0 查询添加一列。传递列保持其类型。每个查询都有 列 (target)、XPath 1.0 表达式 (path)、结果 (kind) 和 多个结果 (multi):
- 结果 — 值类型:
String、Integer、Double、Number、Boolean、Node或NodeSet。 - 多个结果 — 选中多个项的查询如何写入:
SingleCell(第一项)、CollectionCell(列表值)、MultipleColumns(每项一列)、UngroupToRows(每项一行),或JoinedText(各项的文本由 项分隔符 (separator) 连接,默认为空格;项的部分 (XPath) (parts) 改为从这些相对路径的第一个匹配项中获取每个项的文本,并用 部分分隔符 (part_separator) 连接)。 - 空值视为缺失 (
empty_missing) — 不选择任何内容的查询返回缺失单元格。
此部分中的以下字段与查询一起生效:
- 命名空间 (
xpath_namespaces) — 查询使用的{prefix: namespace URI}对。根命名空间前缀 (xpath_root_prefix) 将文档根的默认命名空间绑定到此前缀。 - 在输出中省略 XML 字段 (
xpath_remove_source) — 在输出中省略 XML 字段。 - 结果为假的布尔查询返回缺失单元格 (
xpath_missing_on_false) — 结果为假的Boolean查询返回缺失单元格。不选择任何内容的集合查询返回缺失单元格 (xpath_empty_set_missing) — 不选择任何内容的CollectionCell查询返回缺失单元格。 - 将 XML 字段读取为 HTML 页面 (
xpath_html) — 将该字段读取为 HTML 页面,并修复为html根下的 XML 树。 - “各一行”的项编号列 (
xpath_ungroup_index) — 对于UngroupToRows查询,将每行从 1 开始的项编号写入此列。无结果的“各一行” (xpath_ungroup_empty) 决定查询在其中未选中任何内容的文档会产生什么:一行且值缺失(row,默认)、不产生行(drop),或步骤失败(fail)。 - 仅写入第一个查询的元素构成的表 (
xpath_table) — 仅写入第一个查询的元素构成的表,每个元素一行(例如 HTML 表的每个tr),其子元素作为文本单元格。第一行的表头单元格用于命名列;否则列命名为Column <n>。
列 选项卡是用于 传递 列的标准数据映射器,传递列是您希望带到每个输出行上的源列。
解析所发现的列(元素的属性和子标签)会自动添加到输出中,无需在此列出。当提取出的名称与某个传递列(或先前提取出的列)冲突时,会通过追加数字去重(id → id2 → id3),与 Alteryx 一致。
XML Parse 步骤链的工作方式与 Alteryx 相同:每个传入的列都会被传递,因此后面的步骤可以重新解析先前步骤生成的列,并引用先前步骤提取出的列。