使用 Powershell 将 XML 个元素提取为表格格式

Extract XML elements to tabular format using Powershell

我有以下 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。

$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 存储为 example.xml (FileName 属性),结果如下:

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]