xml - 无法弄清楚如何更改 PowerShell 脚本生成的 XML 节点值
问题描述
几年来我一直在涉足 PowerShell,但我从未处理过 XML,而且我很难找到解决我所看到的问题的方法。我已经阅读了各种论坛上的无数线程,我想我承认我对自己想要完成的工作以及其他人在其他线程中解释的内容还不够了解。
我正在编写其他人编写的 PowerShell 脚本,该脚本主要捕获表数据,并将其导出到 XML 文件。正在导出的表数据在其当前状态下可用,但对于某些不是从表派生的值,我需要找到一种简单的方法来更改 XML 节点的名称。
我的 PS 脚本示例是这样的:
$StartDate = [Management.ManagementDateTimeConverter]::ToDateTime($SYSINFO.LastBootUpTime)
$StartDate = "{0:G}" -F $StartDate
$EndDate = "{0:G}" -F (Get-Date)
$UPTIME = New-TimeSpan -Start $StartDate -End $EndDate
# Format Uptime for "DD:HH:MM:SS.MMMM"
$DispTime = "{0:G}" -F $UPTIME
# Remove .MMMM (Milliseconds)
$DispTime = $DispTime.Split('.')[0]
$DispTime = "$DispTime"
$DispTime | ConvertTo-XML -As String | Out-File -LiteralPath (C:\Scripts\ + "Uptime_Status.xml")
我的 XML 输出最终看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Objects>
<Object Type="System.String">0:06:56:39</Object>
</Objects>
我需要做的是将<Object Type="System.String">
标签更改为其他内容,例如<UPTIME>0:06:56:39</UPTIME>
,甚至<Object Type="System.String" Name="Uptime">0:06:56:39</Object>
目标是将节点的名称与其他 XML 标记区分开来,当我使用非表数据时,这些标记会与此相同。我还看到需要重复执行此操作的可能性,因此想知道是否可能还有一个选项,即在整个 XML 文件中自动使用 PS 变量的值作为 XML 节点名称。因此,例如,如果我正在处理 20 条数据,并且我可能将要捕获到 XML 中的值之一的数据标记为$DispTime
,也许我还可以有另一个变量,例如$DispTime_NodeName = "Uptime"
,然后是生成的 XML可能只是:<Uptime>0:06:56:39</Uptime>
。所以基本上 PS 脚本必须找到包含“_NodeName”的匹配变量名称,然后使用该值作为 XML 节点名称。我疯了吗?这是不可能的吗?这是我想太多了吗?
非常感谢任何愿意提供帮助的人......我将非常感谢我能得到的任何可靠的帮助。请记住,我还是个新手 :) 哈哈
解决方案
对于您问题中的简单示例,您可以从头开始创建自己的 XML 文档:
$xmlDoc = [xml]::new()
# Add declaration
[void]$xmlDoc.AppendChild($xmlDoc.CreateXmlDeclaration('1.0', 'utf-8', $null))
# Add <root> node to document
$root = $xmlDoc.AppendChild($xmlDoc.CreateElement('root'))
# Add <uptime> node to <root>
$uptime = $root.AppendChild($xmlDoc.CreateElement('uptime'))
# Set inner text value on <uptime> node
$uptime.InnerText = $DispTime
# Save document
$xmlDoc.Save((Join-Path C:\Scripts "Uptime_Status.xml"))
如果您想要一种更好的方式来创作 XML 文档,PowerShell Gallery中的Xml
模块可能会成功:
安装:
Install-Module Xml
然后:
Import-Module Xml
$doc = New-XDocument root -Version 1.0 -Encoding utf-8 {
New-XElement uptime {
$DispTime
}
}
$doc.Save((Join-Path C:\Scripts "Uptime_Status.xml"))
推荐阅读
- firebase - React Native + Firebase / NodeMailer - 可能未处理的承诺拒绝
- javascript - 如何在反应中将异步函数的值存储到全局变量中?
- connection - 从 uipath 到雪花的 OBDC 连接
- c# - 在 TabControl 中获取可见的 TabItems
- authentication - 仅用于公钥身份验证的私钥和公钥的加密使用掩码
- java - Java - 如何摆脱标题栏?
- python - 如何调节绑定的激活('
') 事件到窗口的某个区域? - matlab - 洗牌向量元素,使两个相似的元素最多出现两次
- python - 如何使用 K 近邻将标记样本的分布分类?
- json - MongoDB Realm 将 BJSON 转换为 JSON