Элементы списка Powershell для узла XML - PullRequest
0 голосов
/ 28 января 2020

У меня проблемы с получением содержимого из элемента текстового списка winform к нескольким XML узлам.

Когда я пробую свой код:

$fileName = "C:\tools\Options.xml";
$xmlDoc = [System.Xml.XmlDocument](Get-Content $fileName);
$sitecheck = $xmldoc.options.locations.location.site
if ($sitecheck -eq $cboOffice.Text) 
{$txtInfobox.appendtext("Site already exists`r`n")}
else{
$newXmllocation=$xmlDoc.options.locations.AppendChild
($xmlDoc.CreateElement("location"));
$newXmlgroup = $xmlDoc.options.groups.AppendChild($xmlDoc.CreateElement("Group"));
$newXmllocation.SetAttribute(“site”,$cboOffice.text);
$newXmlgroup.SetAttribute(“Name”,$cboOffice.text);
$newXmlgrouplist = $newXmlgroup.AppendChild($xmlDoc.CreateElement("List"));
$newXmlgrouplist.SetAttribute(“Type”,"SecurityGroup");
$group = $txtGetLists.Item
$groups = $txtGetLists.Items
$newXmlgroupitem = foreach ($group in $groups) {
$newXmlgrouplist.AppendChild($xmlDoc.CreateTextNode($group));
    }

И список $txtgetlists.text содержит эти строки:

Group1
Group2
Group3
Group4
Group5

в моем файле XML я получаю:

<Group Name="TestGroup">
<List Type="SecurityGroup">Group1Group2Group3Group4Group5</List> 
</Group>

Вместо желаемого:

<Groups>
<Group Name="TestGroup">
<List Type="SecurityGroup">Group1</List>
<List Type="SecurityGroup">Group2</List> 
<List Type="SecurityGroup">Group3</List> 
<List Type="SecurityGroup">Group4</List> 
<List Type="SecurityGroup">Group5</List> 
</Group>
</Groups>

Другими словами я в конечном итоге все элементы в одной большой строке вместо отдельных узлов.

Может быть, у меня есть совет, как мне это сделать? Я перепробовал все виды переменных «foreach item затем do this», но я не могу понять, как это правильно.

1 Ответ

0 голосов
/ 28 января 2020

Если вы намереваетесь создать новый элемент и добавить эти элементы в качестве дочерних к родительскому, вы должны создать каждого дочернего элемента отдельно и продолжить добавление к родительскому. В своем коде вы перебираете все oop и продолжаете добавлять дочерний элемент List, но каждый раз с разными значениями. Вместо создания нового тега, к нему добавляется значение.

Когда вы надеваете oop на группы, вы должны создать новый элемент, newXmlgrouplist. Если вы повторно используете один и тот же, он будет обновлять его каждый раз вместо добавления нового экземпляра. Используйте $newXmlgrouplist = $doc.CreateElement("List") для создания нового экземпляра каждый раз.

Написал небольшой код, чтобы показать вам, как создавать элементы и добавлять их отдельно

[System.XML.XMLDocument]$doc=New-Object System.XML.XMLDocument
[System.XML.XMLElement]$parent = $doc.CreateElement("Groups")

$parent.SetAttribute("Name", "TestGroup")

$txtGetLists.Items | % { 
    [System.XML.XMLElement]$list = $doc.CreateElement("List")
    $list.SetAttribute("Type", "SecurityGroup")
    $list.InnerText = $_
    $parent.AppendChild($list)
}

$doc.AppendChild($parent)

и результат xml $doc.InnerXml is:

<Groups Name="TestGroup">
    <List Type="SecurityGroup">Group1</List>
    <List Type="SecurityGroup">Group2</List>
    <List Type="SecurityGroup">Group3</List>
    <List Type="SecurityGroup">Group4</List>
    <List Type="SecurityGroup">Group5</List>
</Groups>

ОБНОВЛЕНИЕ

Ваш foreach l oop должен выглядеть следующим образом. Он будет добавлять новый элемент списка в ваши группы при каждой итерации по ним.

$newXmlgroup = $xmlDoc.options.groups.AppendChild($xmlDoc.CreateElement("Group"))
$newXmllocation.SetAttribute("site",$cboOffice.text)
$newXmlgroup.SetAttribute("Name",$cboOffice.text)

foreach($group in $txtGetLists.Items) {
  $newXmlgrouplist = $newXmlgroup.AppendChild($xmlDoc.CreateElement("List"))
  $newXmlgrouplist.SetAttribute("Type","SecurityGroup")
  $newXmlgrouplist.InnerText = $group
}

У него нет выходных данных, поэтому нет необходимости устанавливать $newXmlgroupitem = foreach

Если вы печатаете $newXmlGroup.OuterXml, он должен показать вам полный xml для групп.

...