以下是用于演示的 config.xml 文件内容:
<Configuration>
<Servers>
<Server id="1" status="active">
<Name>Server01</Name>
<IP>192.168.1.100</IP>
<Port>8080</Port>
</Server>
<Server id="2" status="inactive">
<Name>Server02</Name>
<IP>192.168.1.101</IP>
<Port>8081</Port>
</Server>
<Server id="3" status="active">
<Name>Server03</Name>
<IP>192.168.1.102</IP>
<Port>8082</Port>
</Server>
</Servers>
<Settings>
<Timeout>30</Timeout>
<RetryCount>3</RetryCount>
<LogLevel>Debug</LogLevel>
</Settings>
</Configuration>
XML 文件访问
使用 [xml] 类型转换器可以将 XML 文本转换为可导航的 XML 文档对象。可以使用 Get-Content 读取文件后进行转换:
$config = [xml](Get-Content "config.xml")
可以直接使用点符号访问 XML 元素的属性和子节点,XML 元素的属性对应对象的属性:
# 访问 Configuration 下的 Settings 节点
$timeout = $config.Configuration.Settings.Timeout
# 访问 Server 节点的 id 属性
$serverId = $config.Configuration.Servers.Server[0].id
当存在多个相同名称的子节点时,访问该属性会返回一个集合:
# 获取所有 Server 节点的数量
$serverCount = $config.Configuration.Servers.Server.Count
# 访问第一个 Server 节点的 Name 子节点
$firstName = $config.Configuration.Servers.Server[0].Name
# 遍历所有 Server 节点
foreach ($server in $config.Configuration.Servers.Server) {
Write-Host "Server: $($server.Name), IP: $($server.IP)"
}
可以使用点符号的链式访问来获取深层嵌套的数据:
# 获取第二个 Server 的 Port 值
$port = $config.Configuration.Servers.Server[1].Port
修改 XML 数据
加载 XML 文件后,可以直接修改节点内容。
$xml = [xml](Get-Content "config.xml")
# 修改 Timeout 值
$xml.Configuration.Settings.Timeout = "60"
# 修改 Server01 的名称
$xml.Configuration.Servers.Server[0].Name = "PrimaryServer"
可以修改 XML 元素的属性值:
# 修改 Server02 的 status 属性
$xml.Configuration.Servers.Server[1].SetAttribute("status", "active")
修改完成后,使用 Save() 方法将更改保存回文件:
# 保存修改后的 XML
$xml.Save("config_modified.xml")
使用字符串片段创建节点
可以通过 XML 字符串直接创建新节点。
# 定义包含新 Server 节点结构的 XML 字符串
$newServerXml = @'
<Server id="4" status="active">
<Name>Server04</Name>
<IP>192.168.1.103</IP>
<Port>8083</Port>
</Server>
'@
# 将字符串转换为 XML 文档对象
$tempXml = [xml]$newServerXml
# 导入节点到主 XML 文档
# 第二个参数为 `$true` 表示深度导入,即包含该节点的所有子节点和属性
$newNode = $xml.ImportNode($tempXml.Server, $true)
# 将新节点添加到 Servers 节点下
$xml.Configuration.Servers.AppendChild($newNode)
上述代码执行后,原始 XML 结构中将增加一个新的 Server 节点:
<Server id="4" status="active">
<Name>Server04</Name>
<IP>192.168.1.103</IP>
<Port>8083</Port>
</Server>
使用 CreateElement 动态创建节点
可以使用 XML 文档对象的 CreateElement() 方法动态创建元素,然后分别设置其属性和内容。
# 创建一个新的 XML 元素
$newSetting = $xml.CreateElement("MaxConnections")
# 设置元素的文本内容
$newSetting.InnerText = "1000"
# 可选:为元素添加属性
$newSetting.SetAttribute("unit", "connections")
# 将新元素添加到 Settings 节点下
$xml.Configuration.Settings.AppendChild($newSetting)
上述操作会在 Settings 节点下添加:
<MaxConnections unit="connections">1000</MaxConnections>
使用 RemoveChild() 方法可以删除节点:
# 删除 inactive 状态的 Server 节点
$nodeToRemove = $xml.SelectSingleNode("//Server[@status='inactive']")
if ($nodeToRemove) {
$nodeToRemove.ParentNode.RemoveChild($nodeToRemove)
}
对象转换为 XML
使用 ConvertTo-Xml 命令可以将 PowerShell 对象转换为 XML 格式。默认生成 XML 文档对象:
# 将 Server 对象转换为 XML
$serverObject = [PSCustomObject]@{
Name = "WebServer01"
IP = "10.0.0.1"
Services = @("HTTP", "HTTPS")
}
$serverXml = $serverObject | ConvertTo-Xml
使用 -As 参数指定输出格式,String 选项输出 XML 字符串:
# 转换为 XML 字符串
$xmlString = $serverObject | ConvertTo-Xml -As String
可以使用重定向操作符将 XML 字符串保存到文件:
# 保存到文件
$serverObject | ConvertTo-Xml -As String > "server_config.xml"
也可以使用 XML 文档的 Save() 方法将 XML 保存到文件:
# 使用 Save 方法保存
$xmlDoc = $serverObject | ConvertTo-Xml
$xmlDoc.Save("server_save.xml")
导入和导出结构化数据
使用 Export-CliXml 命令可以将 PowerShell 对象序列化并保存到文件:
# 创建复杂的数据结构
$serverData = @{
Name = "AppServer01"
IP = "192.168.1.50"
Services = @("WebApp", "Database", "Cache")
Configuration = @{
MaxConnections = 100
Timeout = 30
LogLevel = "INFO"
}
}
$serverData | Export-CliXml "appserver.clixml"
使用 Import-CliXml 命令可以从文件反序列化并恢复对象:
# 从文件导入数据
$restoredData = Import-CliXml "appserver.clixml"
# 访问导入的数据
$serverName = $restoredData.Name
$services = $restoredData.Services
使用 -Depth 参数可以控制序列化的深度,这对于处理嵌套对象很重要:
# 包含深度嵌套的对象
$nestedData = @{
Level1 = @{
Level2 = @{
Level3 = @{
Value = "DeepData"
}
}
}
}
$nestedData | Export-CliXml "nested.clixml" -Depth 5