Question
[Resolut]Ajouter des données dans un XML
- Charly
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 17
- Remerciements reçus 0
il y a 12 ans 1 semaine #17160
par Charly
[Resolut]Ajouter des données dans un XML a été créé par Charly
Hello !
Je sèche un peu sur l'action suivante :
J'ai fichier XML qui ressemble à ça
[code:1]
<DOC Version='1.0'>
<SHARE PATH=\\Mon_Serveur\Share>
<TITLE>Mon Partage</TITLE>
<GROUP>MON-GROUP</GROUP>
<GROUP>MON-GROUP2</GROUP>
</SHARE>
<SHARE Path=(...)
</SHARE>
</DOC>
[/code:1]
Je voudrais ajouter une entrée SHARE contenant un PATH, un TITRE et des GROUPES.
Pas de soucis j'ai trouvé sur le net des explications sur comment ajouter une ligne contenant ces données.
exemple :
[code:1][XML]$a = Get-Content \".\mon_XML.xml\"
$ancien = @($a.doc.Share)[0]
$new = $ancien.Clone()
$new.Path = \"\\XXXXX\XXXXXXXXXXX\"
$new.TITLE = \"XXXXXXXXXXXX\"
$new.GROUP \"GROUP-XXXXXXXXXX\"
$a.doc.AppendChild($new)
$a.save(\"mon_XML.xml\"«»)[/code:1]
Donc ok, j'ai bien mon entrée dans mon fichier : mon_xml.xml, ça c'est ok.
Mais le hic c'est que mon entrée <GROUP> est multivaluée et pour le moment je sèche.
Comment ma variable $new.GROUP peut elle contenir plusieurs éléments à injecter dans le XML ?<br><br>Message édité par: Oleg, à: 13/03/14 14:07
Je sèche un peu sur l'action suivante :
J'ai fichier XML qui ressemble à ça
[code:1]
<DOC Version='1.0'>
<SHARE PATH=\\Mon_Serveur\Share>
<TITLE>Mon Partage</TITLE>
<GROUP>MON-GROUP</GROUP>
<GROUP>MON-GROUP2</GROUP>
</SHARE>
<SHARE Path=(...)
</SHARE>
</DOC>
[/code:1]
Je voudrais ajouter une entrée SHARE contenant un PATH, un TITRE et des GROUPES.
Pas de soucis j'ai trouvé sur le net des explications sur comment ajouter une ligne contenant ces données.
exemple :
[code:1][XML]$a = Get-Content \".\mon_XML.xml\"
$ancien = @($a.doc.Share)[0]
$new = $ancien.Clone()
$new.Path = \"\\XXXXX\XXXXXXXXXXX\"
$new.TITLE = \"XXXXXXXXXXXX\"
$new.GROUP \"GROUP-XXXXXXXXXX\"
$a.doc.AppendChild($new)
$a.save(\"mon_XML.xml\"«»)[/code:1]
Donc ok, j'ai bien mon entrée dans mon fichier : mon_xml.xml, ça c'est ok.
Mais le hic c'est que mon entrée <GROUP> est multivaluée et pour le moment je sèche.
Comment ma variable $new.GROUP peut elle contenir plusieurs éléments à injecter dans le XML ?<br><br>Message édité par: Oleg, à: 13/03/14 14:07
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 12 ans 1 semaine #17161
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Ajouter des données dans un XML
Salut,
Oleg écrit:
Oleg écrit:
Si tu peux changer ta structure, ajoute un nœud Groups contenant des groupes. Ensuite consulte ce post sur le sujet.Mais le hic c'est que mon entrée <GROUP> est multivaluée et pour le moment je sèche.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 12 ans 1 semaine #17164
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Ajouter des données dans un XML
Après réflexions, je me suis dit que ton cas on peut déjà faire simplement ceci :
[code:1]
$x=@\"
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<DOC Version='1.0'>
<SHARE PATH=\"\\Mon_Serveur\Share\">
<TITLE>Mon Partage</TITLE>
<GROUP>MON-GROUP</GROUP>
<GROUP>MON-GROUP2</GROUP>
</SHARE>
</DOC>
\"@ > c:\temp\x.xml
Function Add-ChildGroup{
param ($Doc, $Root, $GroupName)
$Element = $Doc.CreateElement(\"GROUP\"«»)
$Element.InnerText=$GroupName
[void]$Root.AppendChild($Element)
}
[XML]$Doc = Get-Content \"c:\temp\x.xml\"
$ancien = @($Doc.doc.Share)[0]
$new = $ancien.Clone()
$new.Path = \"\\XXXXX\XXXXXXXXXXX\"
$new.TITLE = \"XXXXXXXXXXXX\"
$new.GROUP|% {$_=\"GROUP-XXXXXXXXXX\"}
$Root=$Doc.doc.AppendChild($new)
Add-ChildGroup $Doc $Root \"GroupX\"
Add-ChildGroup $Doc $Root \"GroupY\"
$Doc.save(\"c:\temp\x2.xml\"«»)
type \"c:\temp\x2.xml\"
# <?xml version=\"1.0\" encoding=\"UTF-8\"?>
# <DOC Version=\"1.0\">
# <SHARE PATH=\"\\Mon_Serveur\Share\">
# <TITLE>Mon Partage</TITLE>
# <GROUP>MON-GROUP</GROUP>
# <GROUP>MON-GROUP2</GROUP>
# </SHARE>
# <SHARE PATH=\"\\XXXXX\XXXXXXXXXXX\">
# <TITLE>XXXXXXXXXXXX</TITLE>
# <GROUP>MON-GROUP</GROUP>
# <GROUP>MON-GROUP2</GROUP>
# <GROUP>GroupX</GROUP>
# <GROUP>GroupY</GROUP>
# </SHARE>
# </DOC>
[/code:1]
[code:1]
$x=@\"
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<DOC Version='1.0'>
<SHARE PATH=\"\\Mon_Serveur\Share\">
<TITLE>Mon Partage</TITLE>
<GROUP>MON-GROUP</GROUP>
<GROUP>MON-GROUP2</GROUP>
</SHARE>
</DOC>
\"@ > c:\temp\x.xml
Function Add-ChildGroup{
param ($Doc, $Root, $GroupName)
$Element = $Doc.CreateElement(\"GROUP\"«»)
$Element.InnerText=$GroupName
[void]$Root.AppendChild($Element)
}
[XML]$Doc = Get-Content \"c:\temp\x.xml\"
$ancien = @($Doc.doc.Share)[0]
$new = $ancien.Clone()
$new.Path = \"\\XXXXX\XXXXXXXXXXX\"
$new.TITLE = \"XXXXXXXXXXXX\"
$new.GROUP|% {$_=\"GROUP-XXXXXXXXXX\"}
$Root=$Doc.doc.AppendChild($new)
Add-ChildGroup $Doc $Root \"GroupX\"
Add-ChildGroup $Doc $Root \"GroupY\"
$Doc.save(\"c:\temp\x2.xml\"«»)
type \"c:\temp\x2.xml\"
# <?xml version=\"1.0\" encoding=\"UTF-8\"?>
# <DOC Version=\"1.0\">
# <SHARE PATH=\"\\Mon_Serveur\Share\">
# <TITLE>Mon Partage</TITLE>
# <GROUP>MON-GROUP</GROUP>
# <GROUP>MON-GROUP2</GROUP>
# </SHARE>
# <SHARE PATH=\"\\XXXXX\XXXXXXXXXXX\">
# <TITLE>XXXXXXXXXXXX</TITLE>
# <GROUP>MON-GROUP</GROUP>
# <GROUP>MON-GROUP2</GROUP>
# <GROUP>GroupX</GROUP>
# <GROUP>GroupY</GROUP>
# </SHARE>
# </DOC>
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Charly
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 17
- Remerciements reçus 0
il y a 12 ans 1 semaine #17166
par Charly
Réponse de Charly sur le sujet Re:Ajouter des données dans un XML
Merci beaucoup Laurent, ça fonctionne impeccable.
Navré pour l'autre post je n'ai pas les droits de le supprimer.
Navré pour l'autre post je n'ai pas les droits de le supprimer.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 12 ans 1 semaine #17167
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Ajouter des données dans un XML
Oleg écrit:
J'ai oublié de préciser que tu peux modifier la fonction afin qu'elle prenne en charge le pipeline, ainsi tu pourras enchaîner l'ajout de groupe à partir d'une collection de groupe.
Qq chose comme :
[code:1]
Get-ADGroup|Add-ChildGroup $Doc $Root
[/code:1]
Dans ce cas supprime son contenu.je n'ai pas les droits de le supprimer.
J'ai oublié de préciser que tu peux modifier la fonction afin qu'elle prenne en charge le pipeline, ainsi tu pourras enchaîner l'ajout de groupe à partir d'une collection de groupe.
Qq chose comme :
[code:1]
Get-ADGroup|Add-ChildGroup $Doc $Root
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 530
- Remerciements reçus 0
il y a 12 ans 1 semaine #17169
par Richard Lazaro
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Réponse de Richard Lazaro sur le sujet Re:Ajouter des données dans un XML
Pour rajouter de l'information, je me suis amusé à coder une petite fonction pour répondre à un besoin d'un projet.
[code:1]
Function Write-XMLData {
[cmdletbinding()]
Param(
[Parameter(Mandatory=$true)] [ValidateSet('Global', 'Information', 'Data', 'Repair')]
[String] $Section,
[Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()]
[String] $Path,
[Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()]
[Hashtable] $Value,
[Switch] $MultiNode
)
$l_PathArray = $Path.Split('\')
$l_CurrentPath = \"`$g_Data.Data.Step$Section\"
$l_PathArray `
| ForEach-Object {
If ((Invoke-Expression -Command \"$l_CurrentPath.$_\"«») -eq $null -or (\"$l_CurrentPath.$_\" -eq \"`$g_Data.Data.Step$Section.$($Path.Replace('\','.'))\" -and $MultiNode)) {
Write-Host \"Create child node $_\"
$l_Node = $g_Data.CreateElement($_)
($g_Data.SelectNodes($l_CurrentPath.Replace('$g_Data.','').Replace('.','/')) | Select-Object -Last 1).AppendChild($l_Node) | Out-Null
}
$l_CurrentPath += \".$_\"
}
$Value.GetEnumerator() `
| ForEach-Object {
If ($_.Key -eq '#Text') {
$l_TextNode = $g_Data.CreateTextNode(\"$($_.Value)\"«»)
($g_Data.SelectNodes($l_CurrentPath.Replace('$g_Data.','').Replace('.','/')) | Select-Object -Last 1).AppendChild($l_TextNode) | Out-Null
} Else {
$l_Attribute = $g_Data.CreateAttribute(\"$($_.Key)\"«»)
$l_Attribute.Value = \"$($_.Value)\"
($g_Data.SelectNodes($l_CurrentPath.Replace('$g_Data.','').Replace('.','/')) | Select-Object -Last 1).Attributes.Append($l_Attribute) | Out-Null
}
}
$g_Data.Save(\"$c_ScriptPath\Datas\data.xml\"«»)
}
[/code:1]
Il permet de rajouter des noeuds et modifier des noeuds unique (ouais pas vraiment de documentation ^^)
Exemple d'appel :
[code:1]
$Value = @{'OnError' = 'False'}
$Value += @{'#Text' = 'Value Text'}
Write-XMLData -Section Information -Path MasterHistory -Value $Value
[/code:1]
[code:1]
Function Write-XMLData {
[cmdletbinding()]
Param(
[Parameter(Mandatory=$true)] [ValidateSet('Global', 'Information', 'Data', 'Repair')]
[String] $Section,
[Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()]
[String] $Path,
[Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()]
[Hashtable] $Value,
[Switch] $MultiNode
)
$l_PathArray = $Path.Split('\')
$l_CurrentPath = \"`$g_Data.Data.Step$Section\"
$l_PathArray `
| ForEach-Object {
If ((Invoke-Expression -Command \"$l_CurrentPath.$_\"«») -eq $null -or (\"$l_CurrentPath.$_\" -eq \"`$g_Data.Data.Step$Section.$($Path.Replace('\','.'))\" -and $MultiNode)) {
Write-Host \"Create child node $_\"
$l_Node = $g_Data.CreateElement($_)
($g_Data.SelectNodes($l_CurrentPath.Replace('$g_Data.','').Replace('.','/')) | Select-Object -Last 1).AppendChild($l_Node) | Out-Null
}
$l_CurrentPath += \".$_\"
}
$Value.GetEnumerator() `
| ForEach-Object {
If ($_.Key -eq '#Text') {
$l_TextNode = $g_Data.CreateTextNode(\"$($_.Value)\"«»)
($g_Data.SelectNodes($l_CurrentPath.Replace('$g_Data.','').Replace('.','/')) | Select-Object -Last 1).AppendChild($l_TextNode) | Out-Null
} Else {
$l_Attribute = $g_Data.CreateAttribute(\"$($_.Key)\"«»)
$l_Attribute.Value = \"$($_.Value)\"
($g_Data.SelectNodes($l_CurrentPath.Replace('$g_Data.','').Replace('.','/')) | Select-Object -Last 1).Attributes.Append($l_Attribute) | Out-Null
}
}
$g_Data.Save(\"$c_ScriptPath\Datas\data.xml\"«»)
}
[/code:1]
Il permet de rajouter des noeuds et modifier des noeuds unique (ouais pas vraiment de documentation ^^)
Exemple d'appel :
[code:1]
$Value = @{'OnError' = 'False'}
$Value += @{'#Text' = 'Value Text'}
Write-XMLData -Section Information -Path MasterHistory -Value $Value
[/code:1]
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.108 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Resolut]Ajouter des données dans un XML