2009-11-12 12 views
7

Sto cercando di utilizzare PowerShell per modificare XML. Non sono stato in grado di copiare XML usando XPath. Posso caricare l'XML, ma non riesco a capire come elencare l'XML con un XPath e creare un altro file XML con quello che recupero.Come si altera XML con PowerShell/XPath e si salva il documento?

$doc = new-object "System.Xml.XmlDocument" 
$doc.Load("XmlPath.xml") 

Inoltre, in che modo aggiungere l'XML rimosso a un altro file XML?

+3

Solo una nota - si può semplicemente caricare il documento XML in questo modo: $ doc = [xml] (xmlpath.xml Get-Content) o $ doc = [xml] (gc xmlpath.xml) – stej

risposta

15

Se stai usando PowerShell 2.0 è possibile utilizzare il nuovo Select-Xml cmdlet per selezionare XML sulla base di un XPath espressione es:

$xml = '<doc><books><book title="foo"/></books></doc>' 
$xml | Select-Xml '//book' 
Node Path   Pattern 
---- ----   ------- 
book InputStream //book 

Per rimuovere nodi:

PS> $xml =[xml]'<doc><books><book title="foo"/><book title="bar"/></books></doc>' 
PS> $xml | Select-Xml -XPath '//book' | 
     Foreach {$_.Node.ParentNode.RemoveChild($_.Node)} 

title 
----- 
foo 
bar 

PS> $xml.OuterXml 
<doc><books></books></doc> 

Poi salvare in un file:

$xml.Save("$pwd\foo.xml") 
Get-Content foo.xml 
<doc> 
    <books> 
    </books> 
</doc> 
+0

quando faccio il $ xml | select-xml -xpath 'xpath' non ottengo alcun output. cosa viene convogliato nel foreach. non sto seguendo ciò che sta facendo la selezione. c'è un modo semplice per sostituire i valori in una determinata posizione xpath? grazie – Bruce227

+1

Ti capita di utilizzare le estensioni della community PowerShell? Se è PSCX, credo che sia un XPathNavigator ma se stai usando PowerShell 2.0 Select-Xml è un oggetto personalizzato creato con una proprietà Node. –

+0

no, non sto usando le estensioni della community di PowerShell. così stai dicendo che $ xml | select-xml -xpath '// Configuration/ConfigXML/Configuration/DiscoveryHandlers' dovrebbe funzionare? bene non fa per me. il xpath che sto mettendo non sembra funzionare. qualche idea? Grazie per tutto l'aiuto. – Bruce227

1

carico Linq Xml assemblee:

[System.Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq") 
[System.Reflection.Assembly]::LoadWithPartialName("System.Xml.XPath") 

Caricare il xml (Nota, è possibile utilizzare ::Load("file") invece di ::Parse(...) per caricare un file:

$xml = [System.Xml.Linq.XDocument]::Parse("<root> <row>Hey</row> <row>you</row> </root>") 

Modifica (in questo caso rimuovere la prima fila :

[System.Xml.XPath.Extensions]::XPathSelectElement($xml, "//row").Remove() 

Salvare nel file:

$xml.Save("MyXml.xml") 

using System.Xml (invece di System.Xml.Linq):

$doc = new-object "System.Xml.XmlDocument" 
$doc.Load("MyXml_int.xml") 

$node = $doc.SelectSingleNode("//row"); 
$node.ParentNode.RemoveChild($node) 

$doc.Save("MyXml_out.xml") 
+0

bene sto facendo questa parte del server che carica le applicazioni e alterando i file di configurazione per quelle applicazioni. non voglio dover caricare un altro assembly, se possibile. non c'è un modo per farlo con il powershell normale? grazie – Bruce227

+0

Bruce227, ho aggiunto l'esempio utilizzando System.Xml. – Nestor

+0

hi nestor, ho provato il tuo system.xml e non ha funzionato. è la "// riga" il valore xpath? se è così sto ottenendo un null quando sto usando il xpath che ho generato. grazie – Bruce227

Problemi correlati