【发布时间】:2017-07-18 22:35:56
【问题描述】:
试图从 XML 文档中收集服务器和环境信息。但是,当我使用 foreach 循环遍历文档时,它会返回树中的两个节点,而不是一次一个。
[xml]$xmlDoc = [xml](Get-Content("C:\temp\compareVHD_info.xml"))
foreach($env in $xmlDoc.pvs.env)
{
if($env -eq "prod")
{ do stuff}
}
XML:
<pvs>
<env>
<prod>
<primaryServer>
<name>name</name>
<storePath>path</storePath>
</primaryServer>
<secondaryServer>
<name>name</name>
<storePath>path</storePath>
</secondaryServer>
</prod>
<nonProd>
<primaryServer>
<name>name</name>
<storePath>path</storePath>
<storePath>path</storePath>
<storePath>path</storePath>
<storePath>path</storePath>
</primaryServer>
<secondaryServer>
<name>name</name>
<storePath>path</storePath>
<storePath>path</storePath>
<storePath>path</storePath>
<storePath>path</storePath>
</secondaryServer>
</nonProd>
</env>
</pvs>
我正在尝试收集主要和辅助服务器名称、存储路径和存储路径。但是,当我使用上面的代码时,它会在 $env 变量中返回“prod nonProd”
提前感谢您的帮助!
【问题讨论】:
-
快速提问。你需要遍历xml文件吗?由于您可以将 xml 文件作为对象加载,因此您可以使用点表示法来访问节点,甚至可以使用 xpath 使用
.SelectSingleNode -
我正在尝试使其尽可能动态,以适应不同的客户端设置。所以是的,这是循环遍历它的最佳做法。
-
当我使用
.SelectSingleNode时,$env 变量有一堆关于对象的信息,而不是来自 XML 的节点字符串。 -
我想我仍然不确定您为什么不使用 XPath。
$xmlDoc.SelectNodes('/pvs/env/prod')应该返回所有prod节点,如果您可能有多个节点。 XPath 的描述性很强,尽管语法不是很用户友好。如果您想要原始 XML,请引用函数返回的节点的OuterXml或InnerXml属性(取决于有意义的内容)。
标签: xml powershell