使用Powershell从XML文件中读取

时间:2013-12-31 06:45:32

标签: xml powershell powershell-ise

我发现很难找到从XML文件中检索内容的方法。下面是我的xml文件的样子。 我正在尝试检索完整的'nlog'节点。请帮忙。

<configuration>
<configSections>
        <section name="nlog" type="NLog.Config.ConfigSectionHandler, ..."/>
 </configSections>
  <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <variable name="LoggingDirectory" value="D:/Logging/"/>
      <include file="${LoggingDirectory}Config/Framework.nlog.xml"/>
  </nlog>
 </configuration>

这是我到目前为止所尝试的内容:

$nlogConfigFile = 'D:\machine.config.nlog.xml'
$nlogConfigXml = new-object xml
$nlogConfigXml.Load($nlogConfigFile);
$nlogConfigXml.PreserveWhitespace = $true

我使用了此博客http://blog.danskingdom.com/powershell-functions-to-get-an-xml-node-and-get-and-set-an-xml-elements-value-even-when-the-element-does-not-already-exist/

中提供的“Get-XmlNode”功能
Get-XmlNode -XmlDocument $nlogConfigXml -NodePath "configuration.configSections.section[@name='nlog']"     ## works OK
Get-XmlNode -XmlDocument $nlogConfigXml -NodePath "configuration.nlog"   ## does NOT work

我也尝试过“Select-Xml”,。SelectSingleNode命令,但它们似乎都没有用。 如果我遗失了什么,请告诉我。

3 个答案:

答案 0 :(得分:2)

这有效:

$nlogConfigXml = [xml]$(gc "D:\machine.config.nlog.xml")

然后,您可以使用对象表示法导航$nlogConfigXml

例如,执行此操作:

$nlogConfigXml.configuration.nlog.variable.name

...输出:

LoggingDirectory

答案 1 :(得分:0)

我建议使用Select-Xml和XPath。请注意,您需要包含命名空间信息才能使其正常工作:

$Xml = [xml]@'
<configuration>
<configSections>
        <section name="nlog" type="NLog.Config.ConfigSectionHandler, ..."/>
 </configSections>
  <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <variable name="LoggingDirectory" value="D:/Logging/"/>
      <include file="${LoggingDirectory}Config/Framework.nlog.xml"/>
  </nlog>
</configuration>
'@

Select-Xml -Xml $Xml -Namespace @{
    n = "http://www.nlog-project.org/schemas/NLog.xsd"
} -XPath //n:nlog

命名空间定义(哈希表值)只是xmlns的复制/粘贴。 您指定的名称(哈希表键)与以后必须在XPath查询中用作XPath元素的前缀相同(例如:n:nlog

答案 2 :(得分:0)

$nlogConfigFile = '.\machine.config.nlog.xml'
[XML]$xmlFileContent = Get-Content $nlogConfigFile
$xmlFileContent.configuration.nlog.variable.name

与之前的答案格式略有不同。