【问题标题】:XML Parsing in Powershell - Specific valuePowershell 中的 XML 解析 - 特定值
【发布时间】:2021-04-04 14:56:39
【问题描述】:

我正在尝试获取值,我需要检索所有结果标签下的所有 httpurlcount

以下是我的示例 XML:

<?xml version='1.0' encoding='UTF-8'?>
<results preview='0'>`enter code here`
<meta>
<fieldOrder>
<field>http_url</field>
<field>count</field>
</fieldOrder>
</meta>
  <result offset='0'>
    <field k='http_url'>
      <value h='1'><text>sample/1</text></value>
    </field>
    <field k='count'>
      <value><text>1</text></value>
    </field>
  </result>
  <result offset='1'>
    <field k='http_url'>
      <value h='1'><text>sample/2</text></value>
    </field>
    <field k='count'>
      <value><text>1</text></value>
    </field>
  </result>
  <result offset='2'>
    <field k='http_url'>
      <value h='1'><text>sample/3</text></value>
    </field>
    <field k='count'>
      <value><text>1</text></value>
    </field>
  </result>
  <result offset='3'>
    <field k='http_url'>
      <value h='1'><text>sample/4</text></value>
    </field>
    <field k='count'>
      <value><text>1</text></value>
    </field>
  </result>
  <result offset='4'>
    <field k='http_url'>
      <value h='1'><text>sample/5</text></value>
    </field>
    <field k='count'>
      <value><text>1</text></value>
    </field>
  </result>
</results>

【问题讨论】:

    标签: xml powershell xml-parsing


    【解决方案1】:

    使用您的示例 xml,您可以执行此操作以获取具有 url 和计数的对象数组:

    [xml]$xml = Get-Content -Path 'D:\Test\test.xml' -Raw
    
    # loop through the tags and return an array of PSObjects
    # each having two properties: 'http_url' and 'count'
    $xml.results.result | ForEach-Object {
        [PsCustomObject] @{
            http_url = ($_.field | Where-Object { $_.k -eq 'http_url' }).value.text
            count    = [int]($_.field | Where-Object { $_.k -eq 'count' }).value.text
        }
    }
    

    结果:

    http_url count
    -------- -----
    sample/1     1
    sample/2     1
    sample/3     1
    sample/4     1
    sample/5     1
    

    【讨论】:

    【解决方案2】:
    
    $xmlDoc = [xml]@"
    <?xml version="1.0" encoding="UTF-8"?>
    <results preview="0">
       'enter code here'
       <meta>
          <fieldOrder>
             <field>http_url</field>
             <field>count</field>
          </fieldOrder>
       </meta>
       <result offset="0">
          <field k="http_url">
             <value h="1">
                <text>sample/1</text>
             </value>
          </field>
          <field k="count">
             <value>
                <text>1</text>
             </value>
          </field>
       </result>
       <result offset="1">
          <field k="http_url">
             <value h="1">
                <text>sample/2</text>
             </value>
          </field>
          <field k="count">
             <value>
                <text>1</text>
             </value>
          </field>
       </result>
       <result offset="2">
          <field k="http_url">
             <value h="1">
                <text>sample/3</text>
             </value>
          </field>
          <field k="count">
             <value>
                <text>1</text>
             </value>
          </field>
       </result>
       <result offset="3">
          <field k="http_url">
             <value h="1">
                <text>sample/4</text>
             </value>
          </field>
          <field k="count">
             <value>
                <text>1</text>
             </value>
          </field>
       </result>
       <result offset="4">
          <field k="http_url">
             <value h="1">
                <text>sample/5</text>
             </value>
          </field>
          <field k="count">
             <value>
                <text>1</text>
             </value>
          </field>
       </result>
    </results>
    "@
    
    $xmlDoc.SelectNodes("//results/result[field[@k='http_url' or 'count']/value/text]") | ForEach-Object {
        [PSCustomObject]@{
            http_url = $_.SelectSingleNode("field[@k='http_url']/value/text")."#text"
            count = $_.SelectSingleNode("field[@k='count']/value/text")."#text"
        }
    }
    
    

    【讨论】:

    • 太棒了!非常感谢,它按预期工作!
    【解决方案3】:

    您可以使用Get-Contet 函数将文件数据检索到字符串。之后,您可以通过[xml] 将字符串转换为 XML 对象。下面是一个使用 Microsoft XML example file 的示例:

    > $xmlObject = [xml] (Get-Content .\books.xml)
    

    以下命令将列出所有书籍:

    > $xmlObject.catalog.book
    
    id           : bk101
    author       : Gambardella, Matthew
    title        : XML Developer's Guide
    genre        : Computer
    price        : 44.95
    publish_date : 2000-10-01
    description  : An in-depth look at creating applications
                         with XML.
    
    id           : bk102
    author       : Ralls, Kim
    title        : Midnight Rain
    genre        : Fantasy
    price        : 5.95
    publish_date : 2000-12-16
    description  : A former architect battles corporate zombies,
                         an evil sorceress, and her own childhood to become queen
                         of the world.
    
    ...
    

    如果你想选择某些属性你可以使用Select-Object:

    > $xmlObject.catalog.book | Select-Object id, author
    
    id    author
    --    ------
    bk101 Gambardella, Matthew
    bk102 Ralls, Kim
    bk103 Corets, Eva
    bk104 Corets, Eva
    bk105 Corets, Eva
    bk106 Randall, Cynthia
    bk107 Thurman, Paula
    bk108 Knorr, Stefan
    bk109 Kress, Peter
    bk110 O'Brien, Tim
    bk111 O'Brien, Tim
    bk112 Galos, Mike
    

    【讨论】:

    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多