Powershell脚本获取XML节点内容的一部分

时间:2018-10-03 21:55:44

标签: 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

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

实现您的要求。我认为这里有两个主要步骤:

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

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

提取XML节点的内容

我的示例XML文档:

# urls.py
router.register(r'computer', ComputerViewSet, base_name='computers')


# views.py
class ComputerViewSet(viewsets.ModelViewSet):
    queryset = Computer.objects.all()
    serializer_class = ComputerSerializer
    lookup_field = 'computer_id'
    # not required any kind of override here [for now :) ]

PS脚本获取内容:

<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>

修剪内容

有很多方法,但是我想我会使用正则表达式。只需循环浏览所有内容并运行正则表达式即可。

[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 } } ..\之间的行终止符之外的任何字符:

/

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