PowerShell - создать переменную из существующего одноуровневого узла XML - PullRequest
1 голос
/ 25 августа 2011

Прежде всего, позвольте мне упомянуть, что я новичок в PowerShell и хотел бы заранее поблагодарить всех за помощь

У меня есть функция в скрипте PowerShell, которая создает множество новых узлов XML с использованием

$fileElement = $xml.CreateElement("FileRef")
$fileElement.SetAttribute("Id",$refId)

Это прекрасно работает, поэтому у меня есть несколько узлов с именем FileRef, каждый с разными атрибутами Id.Переменная $ fileElement снова используется позже в сценарии, где она добавляет свои дочерние узлы, используя $ fileElement.AppendChild.

Теперь у меня есть обстоятельства, когда у меня есть цикл, который вызывает функцию скрипта несколько раз, передавая одну и ту же переменную $ refId.Проблема, которая у меня есть, заключается в том, что на выходе получаются повторяющиеся братья и сестры узла FileRef с тем же идентификатором.

В определенных обстоятельствах я хотел бы создать переменную $ fileElement из существующего элемента узла FileRef с идентификатором id = $ refId (чтобы я мог по-прежнему использовать AppendChild для этой переменной всценарий) вместо создания нового узла XML-узла с id = $ refId (который вызывает дублирование).Например,

if(circumstances) 
{
    # first call to the function in the loop, so create new node sibling
    $fileElement = $xml.CreateElement("FileRef")
    $fileElement.SetAttribute("Id",$refId)
}
else 
{
    # node sibling already exists, do not create new node,  
    # use existing node sibling with id = $refId
    create xml node variable $fileElement here
}

Спасибо

1 Ответ

0 голосов
/ 26 августа 2011

Хорошо, мне удалось решить мою проблему с помощью следующего кода PowerShell:

if(circumstances)
{
    $fileElement = $xml.CreateElement("fileRef")
    $directoryRefElement.SetAttribute("Id",$refId)      
}
else # use existing node
{
    $fileElement = ""
    $currentNode = $xml.get_Item("fileRef")

    do
    {
        $currentId = $currentNode.GetAttribute("Id")
        if ($currentId -eq $refId)
        {
            $fileElement = $currentNode
        }
        else
        {
            $tempNode = $currentNode
            $currentNode = $tempNode.get_NextSibling()
        }
    }
    while($fileElement -eq "")
}

Когда мне нужно найти существующего брата узла, я получаю первый узел нужного типа и проверяю его атрибут Id по переданному в $ refId. Если они не совпадают, я буду смотреть на следующего брата и так далее, пока не совпадут 2 идентификатора.

Хотя это не самый элегантный способ достижения моей цели, тем не менее он работает: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...