xml - 如何通过 Select-Xml 获取属性值?
问题描述
如何使用 获取属性值Select-Xml
?
这是 SSIS .dtsx 文件的片段。
<?xml version="1.0"?>
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts"
DTS:refId="Package"
...
<DTS:ConnectionManagers>
<DTS:ConnectionManager
DTS:refId="Package.ConnectionManagers[DW02.EDW_Source]"
DTS:CreationName="OLEDB"
DTS:DTSID="{12F8E4D7-B122-40AF-A3BD-2B283F9EB3A0}"
DTS:ObjectName="DW02.EDW_Source">
以下代码不会产生所需的结果。如何获取属性值?
$x = Get-Content -Path .\ECW_SPECIALITY.dtsx
$namespace = @{DTS='www.microsoft.com/SqlServer/Dts'}
$x | Select-Xml -XPath '//@ConnectionManagers/@ConnectionManager[@DTS:ObjectName]' -Namespace $namespace
我收到以下错误:
Select-Xml:无法转换值“<DTS:Executable xmlns:DTS="www.microsoft.com/ SqlServer/Dts"" 以键入 "System.Xml.XmlDocument"。错误:“文件意外结束 已经发生了。以下元素未关闭:第 1 行,位置 60。” 在行:1 字符:6 + $x | Select-Xml -XPath '//@ConnectionManagers/@ConnectionManager[@DTS ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Select-Xml], ParentContainsErrorRecordException + FullyQualifiedErrorId : InvalidCastToXmlDocument,Microsoft.PowerShell.Commands.SelectXmlCommand
解决方案
首先,您没有将 XML 数据作为单个字符串传递。这就是导致您观察到的错误的原因,因为该行<DTS:Executable ...
本身不是有效的 XML。
将文件读入单个字符串:
$x = Get-Content '.\ECW_SPECIALITY.dtsx' -Raw # PowerShell v3 or later
$x = Get-Content '.\ECW_SPECIALITY.dtsx' | Out-String # PowerShell v2 or earlier
或将文件直接传递给Select-Xml
:
Select-Xml -Path '.\ECW_SPECIALITY.dtsx' -XPath ...
但是,仅仅修复它仍然不会给您想要的结果,因为您的 XPath 表达式不正确。
- 为了选择命名空间节点或属性,命名空间哈希表中定义的前缀必须在 XPath 表达式中使用。
@
表示一个属性。它不能用于节点。- 方括号定义过滤所选节点/属性的标准,而不是要选择的节点/属性。您需要它来选择具有特定属性的节点,而不是当您想要选择属性本身时。
- 的输出
Select-Xml
为您提供选定的节点或属性 (propertyNode
) 以及输入项 (propertyPath
) 和 XPath 表达式 (propertyPattern
)。要获取节点/属性的值,您必须展开属性Node
。两次。
这应该做你想要的:
$ns = @{DTS='www.microsoft.com/SqlServer/Dts'}
$path = '.\ECW_SPECIALITY.dtsx'
$xpath = '//DTS:ConnectionManagers/DTS:ConnectionManager/@DTS:ObjectName'
# ^node ^node ^attribute
Select-Xml -Path $path -XPath $xpath -Namespace $ns |
Select-Object -Expand Node |
Select-Object -Expand '#text'
有关详细信息,请查看XPath 参考。
推荐阅读
- java - 输入的数字未正确组织在矩阵中
- ruby-on-rails - 如何在查询中使用 mls 编号从 rets 中查找数据
- python - 为什么不继续停止 if 循环中断?
- rust - 如何在 Rust 中正确表示基于堆栈的语言?
- ruby-on-rails - Rails 生成器不会在销毁时删除新创建的文件夹
- java - 如何使用 CompletableFuture 异步发送多个请求并返回成功?
- ruby-on-rails - Rails Sunspot Solr reindex 仅在 prod 上缓慢,但在 staging 和 local
- python - Julia - python pickle - cifar-10 数据
- php - 将json转换为symfony php
- visual-studio-code - VS Code 提示错误的代码段