【问题标题】:How to read CDATA in XML file with PowerShell using a variable for the XML path?如何使用 XML 路径的变量使用 PowerShell 读取 XML 文件中的 CDATA?
【发布时间】:2017-03-16 08:51:10
【问题描述】:

如果我使用变量作为 XML 中元素的路径,我很难读取其中包含 CDATA 的 XML 文件。 (注意:这是基于How to read CDATA in XML file with PowerShell?

在 $xmlsource 文件中

<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 查询语言,所以我更正了上面的问题。

【问题讨论】:

    标签: xml powershell xpath cdata


    【解决方案1】:
    $XmlContent.list.topic.SubTopic.HtmlHead 
    

    正在查找一个名为 list 的属性,然后从该返回值查找“主题”,然后从该返回值...等等。

    $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中)
    • selectSelect-Object 的别名(在模块 Microsoft.PowerShell.Utility 中)

    【讨论】:

    • 谢谢。看起来我没有使用正确的 XML 术语。我正在尝试使用变量来寻址 XML 中的 CDATA。由于“XPATH”是一种查询语言,即使我完全知道 CDATA 在 XML 中的位置,是否只有使用 xpath 才能做到这一点?
    • @Mr.Annoyed 这有点像说“我必须打开所有这些嵌套文件夹才能访问我的文件吗?”然后我说“不,只写它的路径 -> c:\users\annoyed\desktop\thing.txt" 然后你说“但我不想写它的路径,我知道它在哪里,可以资源管理器为我在文件夹上按 Enter 键?”。 XML 是一个嵌套树,就像一个文件系统,而 XPath 是您想要走的路径。 property.property 语法在某些编程语言中是一种方便的语法,而不是 XML。 $XmlContent.SelectNodes('/xpath/to/node')$XmlContent.GetElementsByTagName('HtmlHead') 是相关的。
    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2010-12-21
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多