Select-Xml

Finds text in an XML string or document.

Syntax

Select-Xml
      [-XPath] <string>
      [-Xml] <XmlNode[]>
      [-Namespace <hashtable>]
      [<CommonParameters>]
Select-Xml
      [-XPath] <string>
      [-Path] <string[]>
      [-Namespace <hashtable>]
      [<CommonParameters>]
Select-Xml
      [-XPath] <string>
      -LiteralPath <string[]>
      [-Namespace <hashtable>]
      [<CommonParameters>]
Select-Xml
      [-XPath] <string>
      -Content <string[]>
      [-Namespace <hashtable>]
      [<CommonParameters>]

Description

The Select-Xml cmdlet lets you use XPath queries to search for text in XML strings and documents. Enter an XPath query, and use the Content, Path, or Xml parameter to specify the XML to be searched.

Examples

Example 1: Select AliasProperty nodes

This example gets the alias properties in the Types.ps1xml. For information about this file, see about_Types.ps1xml.

The first command saves the path to the Types.ps1xml file in the $Path variable.

The second command saves the XML path to the AliasProperty node in the $XPath variable.

The Select-Xml cmdlet gets the AliasProperty nodes that are identified by the XPath statement from the Types.ps1xml file. The command uses a pipeline operator (|) to send the AliasProperty nodes to the Select-Object cmdlet. The ExpandProperty parameter expands the Node object and returns its Name and ReferencedMemberName properties.

$Path = "$Pshome\Types.ps1xml"
$XPath = "/Types/Type/Members/AliasProperty"
Select-Xml -Path $Path -XPath $Xpath | Select-Object -ExpandProperty Node

Name                 ReferencedMemberName
----                 --------------------
Count                Length
Name                 Key
Name                 ServiceName
RequiredServices     ServicesDependedOn
ProcessName          Name
Handles              Handlecount
VM                   VirtualSize
WS                   WorkingSetSize
Name                 ProcessName
Handles              Handlecount
VM                   VirtualMemorySize
WS                   WorkingSet
PM                   PagedMemorySize
NPM                  NonpagedSystemMemorySize
Name                 __Class
Namespace            ModuleName

The result shows the Name and ReferencedMemberName of each alias property in the Types.ps1xml file. For example, there is a Count property that is an alias of the Length property.

Example 2: Input an XML document

This example shows how to use the XML parameter to provide an XML document to the Select-Xml cmdlet.

The Get-Content cmdlet gets the content of the Types.ps1xml file and saves it in the $Types variable. The [xml] casts the variable as an XML object.

The Select-Xml cmdlet gets the MethodName nodes in the Types.ps1xml file. The command uses the Xml parameter to specify the XML content in the $Types variable and the XPath parameter to specify the path to the MethodName node.

[xml]$Types = Get-Content $Pshome\Types.ps1xml
Select-Xml -Xml $Types -XPath "//MethodName"

Example 3: Search PowerShell Help files

This example shows how to use the Select-Xml cmdlet to search the PowerShell XML-based cmdlet help files. In this example, we'll search for the cmdlet name that serves as a title for each help file and the path to the help file.

The $Namespace variable contains a hash table that represents the XML namespace that is used for the help files.

The $Path variable contains the path to the PowerShell help files. If there are no help files in this path on your computer, use the Update-Help cmdlet to download the help files. For more information about Updatable Help, see about_Updatable_Help.

The Select-Xml cmdlet searches the XML files for cmdlet names by finding Command:Name element anywhere in the files. The results are stored in the $Xml variable. Select-Xml returns a SelectXmlInfo object that has a Node property, which is a System.Xml.XmlElement object. The Node property has an InnerXML property that contains the actual XML that is retrieved.

The $Xml variable is piped to the Format-Table cmdlet. The Format-Table command uses a calculated property to get the Node.InnerXML property of each object in the $Xml variable, trim the white space before and after the text, and display it in the table, along with the Path to the source file.

$Namespace = @{
    command = "http://schemas.microsoft.com/maml/dev/command/2004/10"
    maml = "http://schemas.microsoft.com/maml/2004/10"
    dev = "http://schemas.microsoft.com/maml/dev/2004/10"
}

$Path = "$Pshome\en-us\*dll-Help.xml"
$Xml = Select-Xml -Path $Path -Namespace $Namespace -XPath "//command:name"
$Xml | Format-Table @{Label="Name"; Expression= {($_.node.innerxml).trim()}}, Path -AutoSize

Name                    Path
----                    ----
Export-Counter          C:\Windows\system32\WindowsPowerShell\v1.0\en-us\Microsoft.PowerShell.Commands.Diagnostics.dll-Help.xml
Get-Counter             C:\Windows\system32\WindowsPowerShell\v1.0\en-us\Microsoft.PowerShell.Commands.Diagnostics.dll-Help.xml
Get-WinEvent            C:\Windows\system32\WindowsPowerShell\v1.0\en-us\Microsoft.PowerShell.Commands.Diagnostics.dll-Help.xml
Import-Counter          C:\Windows\system32\WindowsPowerShell\v1.0\en-us\Microsoft.PowerShell.Commands.Diagnostics.dll-Help.xml
Add-Computer            C:\Windows\system32\WindowsPowerShell\v1.0\en-us\Microsoft.PowerShell.Commands.Management.dll-Help.xml
Add-Content             C:\Windows\system32\WindowsPowerShell\v1.0\en-us\Microsoft.PowerShell.Commands.Management.dll-Help.xml
Checkpoint-Computer     C:\Windows\system32\WindowsPowerShell\v1.0\en-us\Microsoft.PowerShell.Commands.Management.dll-Help.xml
...

Example 4: Different ways to input XML

This example shows two different ways to send XML to the Select-Xml cmdlet.

The first command saves a here-string that contains XML in the $Xml variable. For more information about here-strings, see about_Quoting_Rules.

Select-Xml uses the Content parameter to specify the XML in the $Xml variable.

The third command is the same as the second, except that tt uses a pipeline operator (|) to send the XML in the $Xml variable to the Select-Xml cmdlet.

$Xml = @"
<?xml version="1.0" encoding="utf-8"?>
<Book>
  <projects>
    <project name="Book1" date="2009-01-20">
      <editions>
        <edition language="English">En.Book1.com</edition>
        <edition language="German">Ge.Book1.Com</edition>
        <edition language="French">Fr.Book1.com</edition>
        <edition language="Polish">Pl.Book1.com</edition>
      </editions>
    </project>
  </projects>
</Book>
"@

Select-Xml -Content $Xml -XPath "//edition" | foreach {$_.node.InnerXML}

En.Book1.com
Ge.Book1.Com
Fr.Book1.com
Pl.Book1.com

$Xml | Select-Xml -XPath "//edition" | foreach {$_.node.InnerXML}

En.Book1.com
Ge.Book1.Com
Fr.Book1.com
Pl.Book1.com

Example 5: Use the default xmlns namespace

This example shows how to use the Select-Xml cmdlet with XML documents that use the default xmlns namespace. The example gets the titles of Windows PowerShell ISE user-created snippet files. For information about snippets, see New-IseSnippet.

The $SnippetNamespace variable contains a hash table for the default namespace that snippet XML files use. The hash table value is the XMLNS schema URI in the snippet XML. The hash table key name, snip, is arbitrary. You can use any name that is not reserved, but you cannot use xmlns.

The Select-Xml cmdlet gets the content of the Title element of each snippet. It uses the Path parameter to specify the Snippets directory and the Namespace parameter to specify the namespace in the $SnippetNamespace variable. The value of the XPath parameter is the snip:Title. The results are piped to the ForEach-Object cmdlet, which gets the title from the value of the InnerXml property of the node.

$SnippetNamespace = @{snip = "http://schemas.microsoft.com/PowerShell/Snippets"}

Select-Xml -Path $Home\Documents\WindowsPowerShell\Snippets -Namespace $SnippetNamespace -XPath "//snip:Title" |
    ForEach-Object {$_.Node.Innerxml}

Parameters

-Content

Specifies a string that contains the XML to search. You can also pipe strings to Select-Xml.

Type:String[]
Position:Named
Default value:None
Accept pipeline input:True
Accept wildcard characters:False
-LiteralPath

Specifies the paths and file names of the XML files to search. Unlike Path, the value of the LiteralPath parameter is used exactly as it is typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose it in single quotation marks. Single quotation marks tell PowerShell not to interpret any characters as escape sequences.

Type:String[]
Aliases:PSPath, LP
Position:Named
Default value:None
Accept pipeline input:True
Accept wildcard characters:False
-Namespace

Specifies a hash table of the namespaces used in the XML. Use the format@{<namespaceName> = <namespaceValue>}.

When the XML uses the default namespace, which begins with xmlns, use an arbitrary key for the namespace name. You cannot use xmlns. In the XPath statement, prefix each node name with the namespace name and a colon, such as //namespaceName:Node.

Type:Hashtable
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False
-Path

Specifies the path and file names of the XML files to search. Wildcard characters are permitted.

Type:String[]
Position:1
Default value:None
Accept pipeline input:True
Accept wildcard characters:True
-Xml

Specifies one or more XML nodes.

An XML document will be processed as a collection of XML nodes. If you pipe an XML document to Select-Xml, each document node will be searched separately as it comes through the pipeline.

Type:XmlNode[]
Aliases:Node
Position:1
Default value:None
Accept pipeline input:True
Accept wildcard characters:False
-XPath

Specifies an XPath search query. The query language is case-sensitive. This parameter is required.

Type:String
Position:0
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

Inputs

System.String or System.Xml.XmlNode

You can pipe a path or XML node to this cmdlet.

Outputs

SelectXmlInfo

Notes

XPath is a standard language that is designed to identify parts of an XML document. For more information about the XPath language, see XPath Reference and the Selection Filters section of Event Selection.