【问题标题】:Extract XML elements to tabular format using Powershell使用 Powershell 将 XML 元素提取为表格格式
【发布时间】:2022-10-17 14:56:41
【问题描述】:

我有以下 XML 文档(实际上是一个 TWB 文件——Tableau),我希望将以下元素提取为表格格式。

文件的整体结构是:

必填字段突出显示:

我需要填充如下

我能够提取工作表名称,但未能进一步进行(Powershell 的新手):

示例 XML:

<?xml version='1.0' encoding='utf-8'?>
<!-- build 20181.18.1008.2110                               -->
<workbook original-version="18.1" source-build="2018.1.6 (20181.18.1008.2110)" source-platform="win" version="18.1" xml:base="https://tableau" xmlns:user="http://www.tableausoftware.com/xml/user">
  <repository-location id="ApplicationInfo" path="/t/DEV/workbooks" revision="1.4" site="DEV" />
  <datasources>
    <datasource caption="App Info" inline="true" name="sqlproxy.1xdgpjx1g0jmum1f5c8nx1eniql9" version="18.1">
    </datasource>
  </datasources>
  <worksheets>
    <worksheet name="App Info ">
      <table>
        <view>
          <datasources>
            <datasource caption="App Info" name="sqlproxy.1xdgpjx1g0jmum1f5c8nx1eniql9" />
          </datasources>
          <datasource-dependencies datasource="sqlproxy.1xdgpjx1g0jmum1f5c8nx1eniql9">
            <column aggregation="Count" caption="App Info Grp" datatype="string" default-type="nominal" layered="true" name="[App_Info_Grp]" pivot="key" role="dimension" type="nominal" user-datatype="string" visual-totals="Default" />
            <column aggregation="Count" caption="Primary ID" datatype="string" default-type="nominal" layered="true" name="[Primary_ID]" pivot="key" role="dimension" type="nominal" user-datatype="string" visual-totals="Default" />
            <column-instance column="[App_Info_Grp]" derivation="None" name="[none:App_Info_Grp:nk]" pivot="key" type="nominal" />
            <column-instance column="[Primary_ID]" derivation="None" name="[none:Primary_ID:nk]" pivot="key" type="nominal" />
          </datasource-dependencies>
        </view>
      </table>
    </worksheet>
    <worksheet name="App Info by PrimaryID">
      <table>
        <view>
          <datasources>
            <datasource caption="App Info" name="sqlproxy.1xdgpjx1g0jmum1f5c8nx1eniql9" />
          </datasources>
          <datasource-dependencies datasource="sqlproxy.1xdgpjx1g0jmum1f5c8nx1eniql9">
            <column aggregation="Count" caption="App Info Type" datatype="string" default-type="nominal" layered="true" name="[App_Info_Type]" pivot="key" role="dimension" type="nominal" user-datatype="string" visual-totals="Default" />
            <column aggregation="Count" datatype="string" default-type="nominal" layered="true" name="[EIN]" pivot="key" role="dimension" type="nominal" user-datatype="string" visual-totals="Default" />
            <column-instance column="[App_Info_Type]" derivation="None" name="[none:App_Info_Type:nk]" pivot="key" type="nominal" />
            <column-instance column="[EIN]" derivation="None" name="[none:EIN:nk]" pivot="key" type="nominal" />
          </datasource-dependencies>
        </view>
      </table>
    </worksheet>
  </worksheets>
</workbook>

【问题讨论】:

  • 请发布纯文本而不是屏幕截图
  • 有人可以告诉我如何上传 XML 文件。当我尝试粘贴文件内容时,我收到一条消息,指出文件太长
  • 重现这种情况是否需要整个 XML 文件? MRE 中的“M”代表“最小”。可以使用较小的文件创建 MRE(最小的、可重现的示例)吗?
  • 已上传示例 XML。

标签: xml powershell


【解决方案1】:

不确定这是否正是您所需要的,但它可能会提示您如何处理解析 XML 的逻辑。

$result = foreach($file in Get-ChildItem *.xml) {
    [xml]$xml = Get-Content $file
    foreach($ws in $xml.workbook.worksheets.worksheet) {
        $wsname = $ws.name
        foreach($tb in $ws.table) {
            $tbname = $tb.view.datasources.datasource.caption
            foreach($col in $tb.view.'datasource-dependencies'.'column-instance'.column) {
                [pscustomobject]@{
                    FileName                 = $file.Name
                    'DATASOURCE_CAPTION'     = $tbname
                    'WORKSHEET NAME'         = $wsname
                    'COLUMN-INSTANCE_COLUMN' = $col
                }
            }
        }
    }
}

$result | Format-Table

我将您的 XML 存储为例子.xmlFileName 属性),结果如下:

FileName    DATASOURCE_CAPTION WORKSHEET NAME        COLUMN-INSTANCE_COLUMN
--------    ------------------ --------------        ----------------------
example.xml App Info           App Info              [App_Info_Grp]
example.xml App Info           App Info              [Primary_ID]
example.xml App Info           App Info by PrimaryID [App_Info_Type]
example.xml App Info           App Info by PrimaryID [EIN]

【讨论】:

  • 谢谢你,谢谢你,谢谢你! ** foreach($tb in $ws.table) { $tbname = $tb.view.datasources.datasource.caption foreach($col in $tb.view.'datasource-dependencies'.'column-instance'. column) { ** 是关键!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多