如何使用 XML 路径的变量使用 PowerShell 读取 XML 文件中的 CDATA?
How to read CDATA in XML file with PowerShell using a variable for the XML path?
如果我使用变量作为 XML 中元素的路径,我将很难读取其中包含 CDATA 的 XML 文件。
(注意:这是基于 How to read CDATA in XML file with PowerShell? )
在 $xml 源文件中
<list>
<topic>
<SubTopic>
<topicTitle>Test</topicTitle>
<HtmlHead><![CDATA[<br>randomHTMLhere</br>]]></HtmlHead>
</SubTopic>
<SubTopic2>
<topicTitle>Test2</topicTitle>
<HtmlHead><![CDATA[<br>randomHTMLhere2</br>]]></HtmlHead>
</SubTopic2>
</topic>
</list>
在 PowerShell 中
[String]$xmlsource = "C:\PowerShell_scripts\xmlsource.xml"
[xml]$XmlContent = get-content $xmlsource
#These methods work but the Paths are HARD-CODED
Write-host "`r`nUsing HARD-CODED Paths"
$XmlContent.list.topic.SubTopic.HtmlHead.'#cdata-section'
$XmlContent.list.topic.SubTopic.HtmlHead.InnerText
$XmlContent.list.topic.SubTopic2.HtmlHead.InnerText
#But if the path is given in a variable, I get nothing.
Write-host "`r`nUsing `$pathToElement (returns blank line)"
[String]$pathToElement = 'list.topic.SubTopic.HtmlHead'
$XmlContent.$pathToElement.InnerText #This return a blank line
#Insult to injury
#This kinda works but to parse the path to fit in the 'GetElementsByTagName' method would be clunky, inflexible and would still return the CDATA from *both* 'HtmlHead' elements.
Write-host "`r`nwith GetElementsByTagName(`$var)"
[String]$ElementName= 'HtmlHead'
$XmlContent.GetElementsByTagName($ElementName).'#cdata-section'
Write-host "`r`nwith GetElementsByTagName()"
$XmlContent.GetElementsByTagName('HtmlHead').'#cdata-section'
是否需要将 $pathToElement 转换为特殊数据类型?
注意:Xpath 是 XML 的查询语言,所以我更正了上面的问题。
$XmlContent.list.topic.SubTopic.HtmlHead
正在查找一个名为 属性 的列表,然后从 return 值查找 'topic',然后从 return 值...等等
$XmlContent.$XpathToElement
正在尝试查找一个名为 list.topic.SubTopic.HtmlHead
的单曲 属性 但没有找到它。
我认为 'list.topic.SubTopic.HtmlHead' 不是 XPath 表达式的正确形式。你可以这样做:
$node = Select-Xml -xml $XmlContent -XPath '/list/topic/SubTopic/HtmlHead' | select -expand node
$node.InnerText
编辑:并执行
Select-Xml -xml $xml -XPath '/list/topic//HtmlHead'
获取 SubTopic 和 SubTopic2 的 HtmlHeads。
自动生成 PS 来自我的代码块的帮助链接(如果可用):
Select-Xml
(在模块 Microsoft.PowerShell.Utility
中)
select
是 Select-Object
的别名(在模块 Microsoft.PowerShell.Utility
中)
如果我使用变量作为 XML 中元素的路径,我将很难读取其中包含 CDATA 的 XML 文件。 (注意:这是基于 How to read CDATA in XML file with PowerShell? )
在 $xml 源文件中
<list>
<topic>
<SubTopic>
<topicTitle>Test</topicTitle>
<HtmlHead><![CDATA[<br>randomHTMLhere</br>]]></HtmlHead>
</SubTopic>
<SubTopic2>
<topicTitle>Test2</topicTitle>
<HtmlHead><![CDATA[<br>randomHTMLhere2</br>]]></HtmlHead>
</SubTopic2>
</topic>
</list>
在 PowerShell 中
[String]$xmlsource = "C:\PowerShell_scripts\xmlsource.xml"
[xml]$XmlContent = get-content $xmlsource
#These methods work but the Paths are HARD-CODED
Write-host "`r`nUsing HARD-CODED Paths"
$XmlContent.list.topic.SubTopic.HtmlHead.'#cdata-section'
$XmlContent.list.topic.SubTopic.HtmlHead.InnerText
$XmlContent.list.topic.SubTopic2.HtmlHead.InnerText
#But if the path is given in a variable, I get nothing.
Write-host "`r`nUsing `$pathToElement (returns blank line)"
[String]$pathToElement = 'list.topic.SubTopic.HtmlHead'
$XmlContent.$pathToElement.InnerText #This return a blank line
#Insult to injury
#This kinda works but to parse the path to fit in the 'GetElementsByTagName' method would be clunky, inflexible and would still return the CDATA from *both* 'HtmlHead' elements.
Write-host "`r`nwith GetElementsByTagName(`$var)"
[String]$ElementName= 'HtmlHead'
$XmlContent.GetElementsByTagName($ElementName).'#cdata-section'
Write-host "`r`nwith GetElementsByTagName()"
$XmlContent.GetElementsByTagName('HtmlHead').'#cdata-section'
是否需要将 $pathToElement 转换为特殊数据类型?
注意:Xpath 是 XML 的查询语言,所以我更正了上面的问题。
$XmlContent.list.topic.SubTopic.HtmlHead
正在查找一个名为 属性 的列表,然后从 return 值查找 'topic',然后从 return 值...等等
$XmlContent.$XpathToElement
正在尝试查找一个名为 list.topic.SubTopic.HtmlHead
的单曲 属性 但没有找到它。
我认为 'list.topic.SubTopic.HtmlHead' 不是 XPath 表达式的正确形式。你可以这样做:
$node = Select-Xml -xml $XmlContent -XPath '/list/topic/SubTopic/HtmlHead' | select -expand node
$node.InnerText
编辑:并执行
Select-Xml -xml $xml -XPath '/list/topic//HtmlHead'
获取 SubTopic 和 SubTopic2 的 HtmlHeads。
自动生成 PS 来自我的代码块的帮助链接(如果可用):
Select-Xml
(在模块Microsoft.PowerShell.Utility
中)select
是Select-Object
的别名(在模块Microsoft.PowerShell.Utility
中)