首页 > 解决方案 > 用于获取部分 XML 节点内容的 Powershell 脚本

问题描述

如何只获取 XML 节点文本的一部分?

我有这段 XML:

  <CorpusLink>../Metadata/A_short_autobiography_of_Herculino_Alves.xml</CorpusLink>
  <CorpusLink >../Metadata/Wordlist_and_phrases_-_modifiers.xml</CorpusLink>
  <CorpusLink >../desano-silva-0151/Metadata/Wordlist_fruits_and_cultural_items.xml</CorpusLink>
  <CorpusLink >../desano-silva-0151/Metadata/The_Turtle_and_the_Deer.xml</CorpusLink>
  <CorpusLink >../desano-silva-0151/Metadata/Wordlist_and_phrases_parts_of_a_tree.xml</CorpusLink>
  <CorpusLink >../desano-silva-0151/Metadata/Wordlist_and_phrases_.xml</CorpusLink>

我只需要在每个文本中提取这段文本:

../Metadata

../desano-silva-0151/Metadata

我有这个代码:

$j = 0
$TrgContent.METATRANSCRIPT.Corpus.CorpusLink | ForEach-Object {
[String]$_.'#text'= % {$alltext[$j] + "xml" $j++}}

但它给了我所有的文字:

../Metadata/A_short_autobiography_of_Herculino_Alves.xml

../desano-silva-0151/Metadata/Wordlist_fruits_and_cultural_items.xml

提前感谢您的帮助。

标签: powershell

解决方案


实现你所要求的。我认为我们有两个主要步骤:

  1. 提取 XML 节点的内容。
  2. 修剪内容并仅获取您需要的内容。

我对您现有的脚本不是很熟悉,所以我将在这里解释所有两个步骤。第一步对您来说是可选的。

提取 XML 节点的内容

我的示例 XML 文档:

<Corpus>
    <CorpusLink>../Metadata/A_short_autobiography_of_Herculino_Alves.xml</CorpusLink>
    <CorpusLink>../Metadata/Wordlist_and_phrases_-_modifiers.xml</CorpusLink>
    <CorpusLink>../desano-silva-0151/Metadata/Wordlist_fruits_and_cultural_items.xml</CorpusLink>
    <CorpusLink>../desano-silva-0151/Metadata/The_Turtle_and_the_Deer.xml</CorpusLink>
    <CorpusLink>../desano-silva-0151/Metadata/Wordlist_and_phrases_parts_of_a_tree.xml</CorpusLink>
    <CorpusLink>../desano-silva-0151/Metadata/Wordlist_and_phrases_.xml</CorpusLink>
</Corpus>

PS脚本获取内容:

[xml] $XmlDocument = Get-Content D:\Path_To_Your_File
$XmlDocument.Corpus.CorpusLink # Content of the nodes you need

修剪内容

有很多方法,但我想我会使用正则表达式。只需遍历所有内容并运行正则表达式。

$XmlDocument2.Corpus.CorpusLink | Foreach-Object {
    if ($_ -match "\.\.\/.*?\/") {
        $Matches.Values
    }    
}

..\关于正则表达式,它匹配除和之间的行终止符以外的任何字符/

\.\.  # Escape for 2 dots `..`
\/    # Escapefor slash `/`
.*?   # Takes any character except for line terminators in between other listed characters (above and below)
\/    # Escape for slash `/`

我暗示这些字符串的结构是稳定的,因此是正则表达式。


推荐阅读