如何使用csv列标题powershell获取xml字段值

2023-12-25

当我使用 for 循环然后在代码中添加值 $b 时({ $_.'field_name' -eq $b}然后它给出空白值而不是结果。

$CSVpath = "G:\1.csv"
$columncount=((Get-Content $CSVpath)[0] -split ",").count
write-host $columncount
$xml= "G:\1.xml"
[xml] $xmlDoc = Get-Content $xml
for($i=0; $i -le $columncount;$i++){
$a = ((Get-Content $CSVpath)[0] -split(','))[$i]
$b= "'$a'"
Function xml{
param($value)
$xml= "G:\1.xml"
[xml] $xmlDoc = Get-Content $xml
$a1= $xmlDoc.enum_types.enum_type.Where({ $_.'field_name' -eq  $b}, 'First').items.item.where({ $_.id -eq 1}).value
$d = $a1.'#cdata-section'
write-host  $d
}
xml $b
}

请帮助我解决问题。 请找到xml:

    <enum_types>
    
        <enum_type field_name="Test1">
            <items>
                <item>
                    <id>1</id>
                    <value>A</value>
                </item>
            </items>
            </enum_type>
<enum_type field_name="Test2">
            <items>
                <item>
                    <id>1</id>
                    <value>A</value>
                </item>
            </items>
            </enum_type>
        </enum_types>

Please find csv file : enter image description here


这是代码的简化版本:

$CSVpath = "G:\1.csv"
$xmlPath = "G:\1.xml"

# This is a more robust (and faster) way to load XML files.
($xmlDoc = [xml]::new()).Load((Convert-Path $xmlPath))

# Get all column names
$columnNames = (Get-Content -First 1 $CSVpath) -split ',' -replace '"'
Write-Host "Column count: $($columnNames.Count); names: $columnNames"

foreach ($columnName in $columnNames) {
  @($xmlDoc.enum_types.enum_type.Where({ $_.field_name -eq $columnName }, 'First').
   items).ForEach({ $_.item }).Where({ $_.id -eq 1 }).value
}

它为我输出以下内容:

Column count: 2; names: Test1 Test2
A
A

Note:

  • 由于 XML 文档中没有 CDATA 部分,因此不需要.'#cdata-section'

  • 使用理由.ForEach()枚举名为的子元素<item>,具体来说 - 虽然对于示例 XML 文档来说并不是绝对必要的,因为只有one这样的子元素 - 解释于这个答案 https://stackoverflow.com/a/68884190/45375.

    • Use of @(...), the array-subexpression operator https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Operators#array-subexpression-operator--, in order to apply .ForEach() https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Arrays#foreach (and .Where()) safely is only required in Windows PowerShell, due to an unfortunate bug[1], which has since been fixed in PowerShell (Core) 7+.

    • 链接的答案还显示了一个更快的基于 XPath 的解决方案,通过Select-Xml https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/select-xml,您可以类似地应用到[xml]实例已在内存中($xmlDoc在这种情况下),通过其.SelectSingleNode() https://learn.microsoft.com/en-US/dotnet/api/System.Xml.XmlDocument.SelectSingleNode实例方法。


以上仅适用于列名CSV 文件的,带有硬编码的 id价值 - 就像你自己的尝试一样。

To 根据以下内容从 XML 中提取数据data在 CSV 中并根据填充的列:

$CSVpath = "G:\1.csv"
$xmlPath = "G:\1.xml"

# This is a more robust (and faster) way to load XML files.
($xmlDoc = [xml]::new()).Load((Convert-Path $xmlPath))

# Import the CSV.
$csvRows = Import-Csv $CSVpath
# Get the column names.
$columnNames = $csvRows[0].psobject.Properties.Name

foreach ($csvRow in $csvRows) {
  foreach ($columnName in $columnNames) {
    $id = $csvRow.$columnName
    if (-not $id) { continue }
    @($xmlDoc.enum_types.enum_type.Where({ $_.field_name -eq $columnName }, 'First').
      items).ForEach({ $_.item }).Where({ $_.id -eq $id }).value
  }
}

注意:对于这样的嵌套循环,绝对值得考虑切换到 XPath 解决方案.SelectSingleNode()以提高性能。

[1] .ForEach() and .Where() should work on any object, even scalar (non-collection) ones, but in Windows PowerShell that doesn't work with certain types, such as XML elements.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用csv列标题powershell获取xml字段值 的相关文章

随机推荐

  • MSI 安装程序失败且未删除以前的安装

    我已经构建了一个我想要部署并经常更新的 MSI 不幸的是 当您安装 MSI 然后尝试安装同一 MSI 的较新版本时 它会失败 并显示类似 已安装此产品的另一个版本 此版本的安装无法继续 的消息 MSI 是使用 Visual Studio 2
  • 从结构句柄的 System::String^ 成员编组到 std::string

    我正在尝试从 System String 编组到 std string 通常这可以通过marshal as
  • 运行 Docker 镜像时无法访问 jarfile

    我是 Spring Boot 微服务和 Docker 的新手 微服务项目中的dockerfile 码头工人构建 泊坞窗图像 运行镜像时出现错误 无法访问jarfile register server jar 干杯 肖恩 您需要指定绝对目标路
  • 在Spring MVC中,使用@ResponseBody时如何设置mime类型标头

    我有一个返回 JSON 字符串的 Spring MVC 控制器 我想将 mimetype 设置为 application json 我怎样才能做到这一点 RequestMapping method RequestMethod GET val
  • 是否可以为动态 if 语句创建表达式树?

    我有一种情况 我读取业务逻辑并将变量替换为实际值 然后我需要对其进行评估以获得结果 我目前正在使用 bcParser 来执行此操作 它对于所有像 excel 格式一样编写的逻辑都可以正常工作 向我抛出的曲线球是 if 条件不会像 excel
  • 数据库关系不属于 BCNF 的最低限度证明是什么?

    我有以下功能依赖性 它们代表我的关系上的所有功能依赖性 1 BrokerName gt Office 2 StockName gt Dividend 3 InvestorId gt BrokerName 4 InvestorId Stock
  • 求指数总和的解

    我正在尝试用Python numpy scipy 一切都可用 来数值求解这个方程 在这个公式中K是一个常数 f and g是取决于 E 计数器的两项 这是积分的离散表示 其中x是我正在寻找的变量 举个例子 E3 个术语是 also f E
  • 有没有比单元素数组更好的引用容器?

    Java 匿名类只能从周围方法访问变量 前提是该变量是final 因此内部类无法写入该变量 为了捕获由封闭类型创建的对象 我创建了一个final作为参考的单元素数组 final String ref new String 1 final R
  • Python从不同项目导入包

    我正在尝试从不同的项目导入包 但它无法识别我尝试从中导入的项目 我查看了这个问题的各种答案 包括python 导入另一个与本地模块名称相同的项目模块 https stackoverflow com questions 16786563 py
  • 如何创建 HTML 格式的下载链接?

    我对 HTML 有一个基本的了解 我想在我的示例网站中创建下载链接 但我不知道如何创建它 如何创建下载文件而不是访问文件的链接 在支持 HTML5 的现代浏览器中 可以执行以下操作 a href link to your download
  • Android Preferenceactivity getView

    我有这样一段代码 我想编辑我的自定义首选项布局的文本属性 但是 通过 getView 函数对对象进行的任何更改都不会影响首选项屏幕中的实际列表 有任何想法吗 我知道我无法扩展 PreferenceScreen 并且在这种情况下我无法使用任何
  • 使用 ToExpando 方法时出现问题

    您好 我尝试使用 ToExpando 解决方案在剃刀视图中使用匿名类 我使用这个解决方案 gt Razor 中的动态匿名类型导致 RuntimeBinderException https stackoverflow com question
  • 未选择链接器文件

    我正在使用链接器文件处理应用程序中的问题 发生的事情是在资源管理器选项卡中 链接器文件似乎没有被 选择 我必须提到我也有一个引导加载程序 我收到错误 944 地址 1FC02FF8h 处的数据冲突 我认为这与该错误有关 有人能帮我吗 非常感
  • Android Studio 中的 Apache POI 库错误..?

    我添加了 Apache POI 的 5 个 jar 文件 以便我可以将文本另存为 docx 文档 但我无法先运行该应用程序我在年级中遇到了 210 错误 现在我遇到了此错误有人可以帮助我吗 我按照这个例子https www tutorial
  • UDP可以重传丢失的数据吗?

    我知道该协议不支持这一点 但是对于需要一定程度的可靠性的客户端来说 在其应用程序中构建一种在发现数据包损坏时请求重传的方法是否很常见 如果客户端需要可靠性 或者有时只是some可靠性 但不是 TCP 提供的任何其他功能 例如严格的按顺序交付
  • window.top.location 与 window.location

    如何同步window top location和window location 这是设置框架父级的方法 top 到框架文档的位置 top location self location 当然 这段代码必须在 iframe 内执行 并且容易受到
  • 在 Firebase 的 onAuthStateChanged() 中使用 async/await 的最佳方法是什么?

    我在 React Native 中使用带有 async await 的 Firebase 身份验证 我正在寻找一种更好的方法来等待 firebase 函数内部 所以我的问题是在内部使用 async await 的最佳方法是什么firebas
  • 无初始延迟的去抖

    RxJS 中是否有一个运算符可以在不延迟 突发中的第一个事件 的情况下进行反跳 但会延迟 并始终发出 突发中的最后一个事件 像这样的东西 a b c d e f after awesome debounce 2 dashes 变成 a b
  • Android - 如何将上下文参数传递给方法?

    我正在尝试为我女儿开发一个简单的应用程序 但我不是专业人士 我想知道如何将上下文传递给布尔方法 我的问题是 当尝试合并下面的两个代码时 private boolean isNetworkAvailable ConnectivityManag
  • 如何使用csv列标题powershell获取xml字段值

    当我使用 for 循环然后在代码中添加值 b 时 field name eq b 然后它给出空白值而不是结果 CSVpath G 1 csv columncount Get Content CSVpath 0 split count wri