我尝试在XML文件中显示每个子节点,但是没有显示某些节点。下面是我的powershell脚本。
$dst_web_config = "C:\Users\vel\web.config"
$src_web_config = "f:\Script_test\web.config"
# Creating XML objects for live and integration
$src_xml = New-Object -TypeName XML
$dst_xml = New-Object -TypeName XML
$src_xml.Load($src_web_config)
$dst_xml.Load($dst_web_config)
# Check nodes available
$src_top_node = $src_xml.DocumentElement.Name
$dst_top_node = $dst_xml.DocumentElement.Name
# Defining recursive function
function compare_nodes($node)
{
if ($dst_xml.$dst_top_node.$node.HasChildNodes)
{
$dst_xml.SelectNodes("$dst_top_node/$node/*") | Select-Object -Expand Name | % {
$xpath_node = [string]$node + "/" + [string]$_
$path_node = [string]$node + "." + [string]$_
write-host $path_node
compare_nodes($path_node)
}
}
else
{
#write-host "No Child found for" $node
return
}
}
if ($src_top_node -eq $dst_top_node)
{
if ($dst_xml.$dst_top_node.HasChildNodes)
{
#write-host "Child Node exist for " $dst_top_node
$dst_xml.SelectNodes("$dst_top_node/*") | Select-Object -Expand Name | % {
compare_nodes($_)
}
}
else
{
write-host "No child nodes for "$dst_top_node
}
}
else
{
write-host $src_top_node" is not present in destination file"
}
我正在放置一些XML文件,其中所有子节点都没有显示出来。
<configuration>
<configSections>
<section name="siteMapConfiguration" type="NRI.Helpers.Configuration.SiteMapConfiguration, NRI.Helpers" />
<section name="promotionCategoriesSection" type="NRI.Helpers.Configuration.PromotionCategoriesConfigurationSection, NRI.Helpers" />
<section name="BaseRestExtensions" type="domino.Web.BaseRest.Configuration.BaseRestSection, domino" requirePermission="false" />
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
<section name="townSearchSection" type="NRI.Helpers.Configuration.SearchConfigurationSection, NRI.Helpers" />
<section name="userTypesSection" type="NRI.Helpers.Configuration.UserTypesConfigurationSection, NRI.Helpers" />
</configSections>
<system.net>
<mailSettings>
<smtp>
<network host="127.0.0.1" userName="username" password="password" />
</smtp>
</mailSettings>
</system.net>
在脚本输出中,我没有得到&#34; sectionGroup&#34;,&#34; smtp&#34;从上面的xml。这是两个典型的例子。如何确保脚本显示所有子节点?
答案 0 :(得分:0)
这里有几件事情。
首先,当我使用您的代码运行时,我将获得sectionGroup
。但是我看到它显示为configSections.system.web.webPages.razor
,因为该节点有一个名称,并且您在管道中使用Select-Object -Expand Name
。
其次,虽然它没有引起问题,但是函数调用语法不正确。 compare_nodes($_)
应为compare_nodes $_
,compare_nodes($path_node)
应为compare_nodes $path_node
。如果添加更多参数,这会让你感到困惑,因为myfunc($a, $b)
与PowerShell中的myfunc $a $b
非常不同。
最后,您的算法在smtp
的情况下不起作用,因为您的名称中包含.
的元素。当您使用等于$node
的{{1}}递归时,"system.net.mailSettings"
的测试失败。
HasChildNodes
正在评估:
if ($dst_xml.$dst_top_node.$node.HasChildNodes)
而不是:
if ($dst_xml.$dst_top_node."system.net.mailsettings".HasChildNodes)
您只需运行以下命令即可对其进行测试:
if ($dst_xml.$dst_top_node."system.net".mailsettings.HasChildNodes)
重写这一点非常重要。我建议使用XmlNode对象本身,然后传递带路径的第二个参数(仅用于输出)。例如,
$dst_xml.$dst_top_node."system.net.mailsettings"
$dst_xml.$dst_top_node."system.net".mailsettings