Question [Resolut]Ajouter des données dans un XML

Plus d'informations
il y a 12 ans 1 semaine #17160 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

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 1 semaine #17161 par Laurent Dardenne
Salut,
Oleg écrit:

Mais le hic c'est que mon entrée &lt;GROUP&gt; est multivaluée et pour le moment je sèche.

Si tu peux changer ta structure, ajoute un nœud Groups contenant des groupes. Ensuite consulte ce post sur le sujet.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 1 semaine #17164 par Laurent Dardenne
Après réflexions, je me suis dit que ton cas on peut déjà faire simplement ceci :
[code:1]
$x=@\&quot;
&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;
&lt;DOC Version='1.0'&gt;
&lt;SHARE PATH=\&quot;\\Mon_Serveur\Share\&quot;&gt;
&lt;TITLE&gt;Mon Partage&lt;/TITLE&gt;
&lt;GROUP&gt;MON-GROUP&lt;/GROUP&gt;
&lt;GROUP&gt;MON-GROUP2&lt;/GROUP&gt;
&lt;/SHARE&gt;
&lt;/DOC&gt;
\&quot;@ &gt; c:\temp\x.xml

Function Add-ChildGroup{
param ($Doc, $Root, $GroupName)

$Element = $Doc.CreateElement(\&quot;GROUP\&quot;«»)
$Element.InnerText=$GroupName
[void]$Root.AppendChild($Element)
}

[XML]$Doc = Get-Content \&quot;c:\temp\x.xml\&quot;
$ancien = @($Doc.doc.Share)[0]
$new = $ancien.Clone()

$new.Path = \&quot;\\XXXXX\XXXXXXXXXXX\&quot;
$new.TITLE = \&quot;XXXXXXXXXXXX\&quot;
$new.GROUP|% {$_=\&quot;GROUP-XXXXXXXXXX\&quot;}

$Root=$Doc.doc.AppendChild($new)

Add-ChildGroup $Doc $Root \&quot;GroupX\&quot;
Add-ChildGroup $Doc $Root \&quot;GroupY\&quot;
$Doc.save(\&quot;c:\temp\x2.xml\&quot;«»)
type \&quot;c:\temp\x2.xml\&quot;
# &lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;
# &lt;DOC Version=\&quot;1.0\&quot;&gt;
# &lt;SHARE PATH=\&quot;\\Mon_Serveur\Share\&quot;&gt;
# &lt;TITLE&gt;Mon Partage&lt;/TITLE&gt;
# &lt;GROUP&gt;MON-GROUP&lt;/GROUP&gt;
# &lt;GROUP&gt;MON-GROUP2&lt;/GROUP&gt;
# &lt;/SHARE&gt;
# &lt;SHARE PATH=\&quot;\\XXXXX\XXXXXXXXXXX\&quot;&gt;
# &lt;TITLE&gt;XXXXXXXXXXXX&lt;/TITLE&gt;
# &lt;GROUP&gt;MON-GROUP&lt;/GROUP&gt;
# &lt;GROUP&gt;MON-GROUP2&lt;/GROUP&gt;
# &lt;GROUP&gt;GroupX&lt;/GROUP&gt;
# &lt;GROUP&gt;GroupY&lt;/GROUP&gt;
# &lt;/SHARE&gt;
# &lt;/DOC&gt;
[/code:1]

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
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.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 1 semaine #17167 par Laurent Dardenne
Oleg écrit:

je n'ai pas les droits de le supprimer.

Dans ce cas supprime son contenu.

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.

Plus d'informations
il y a 12 ans 1 semaine #17169 par Richard Lazaro
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 = \&quot;`$g_Data.Data.Step$Section\&quot;

$l_PathArray `
| ForEach-Object {
If ((Invoke-Expression -Command \&quot;$l_CurrentPath.$_\&quot;«») -eq $null -or (\&quot;$l_CurrentPath.$_\&quot; -eq \&quot;`$g_Data.Data.Step$Section.$($Path.Replace('\','.'))\&quot; -and $MultiNode)) {
Write-Host \&quot;Create child node $_\&quot;
$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 += \&quot;.$_\&quot;
}

$Value.GetEnumerator() `
| ForEach-Object {
If ($_.Key -eq '#Text') {
$l_TextNode = $g_Data.CreateTextNode(\&quot;$($_.Value)\&quot;«»)
($g_Data.SelectNodes($l_CurrentPath.Replace('$g_Data.','').Replace('.','/')) | Select-Object -Last 1).AppendChild($l_TextNode) | Out-Null
} Else {
$l_Attribute = $g_Data.CreateAttribute(\&quot;$($_.Key)\&quot;«»)
$l_Attribute.Value = \&quot;$($_.Value)\&quot;
($g_Data.SelectNodes($l_CurrentPath.Replace('$g_Data.','').Replace('.','/')) | Select-Object -Last 1).Attributes.Append($l_Attribute) | Out-Null
}
}

$g_Data.Save(\&quot;$c_ScriptPath\Datas\data.xml\&quot;«»)

}
[/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 }

\\&quot;Problems cannot be solved by the same level of thinking that created them.\\&quot; - Albert Einstein

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.108 secondes
Propulsé par Kunena