I\'m having problem with the most efficient way to get all the values of the nodes with certain name from XML.
For example:
You're trying to do different things here, so you won't be able to use the exact same code for both operations.
In your first example you want to select the value of all nodes with the name MyNode. Select the nodes with the XPath expression //MyNode and expand their #text property. There are various ways to do this, for instance with Select-Xml, as @PetSerAl suggested:
Select-Xml -XPath '//MyNode' -Path 'C:\path\to\first.xml' |
Select-Object -Expand Node |
Select-Object -Expand '#text'
or by importing the file as an XmlDocument object and using its SelectNodes() method:
[xml]$xml = Get-Content 'C:\path\to\first.xml'
$xml.SelectNodes('//MyNode') | Select-Object -Expand '#text'
In your second example you want to select the value of the attribute MyArgument from all nodes that have this particular attribute. Use the XPath expression //@MyArgument to select all attributes MyArgument, then expand their value as before, like this:
Select-Xml -XPath '//@MyArgument' -Path 'C:\path\to\second.xml' |
Select-Object -Expand Node |
Select-Object -Expand '#text'
or like this:
[xml]$xml = Get-Content 'C:\path\to\second.xml'
$xml.SelectNodes('//@MyArgument') | Select-Object -Expand '#text'
Side note:
$xml = New-Object System.Xml.XmlDocument
$xml.load('C:\path\to\your.xml')
and
[xml]$xml = Get-Content 'C:\path\to\your.xml'
do the same thing, so use one or the other, not both.