2015-09-18 3 views
1

В PowerShell v3, я создал объект XmlDocument так:Как обновить значение узла в System.Xml.XmlDocument?

[System.Xml.XmlDocument]$xmldoc = new-object System.Xml.XmlDocument 
$xmldoc.Load($xmlfile) 

После некоторой обработки, я хочу, чтобы позволить пользователю обновить значение узла в $xmlfile.

С учетом имени узла и нового значения, которое необходимо назначить, как мне обновить $xmldoc?

$node = StartBoundry 
$newvalue = StringValue 

Я понимаю, что можно сохранить, как это:

$xmldoc.Save($xmlfile) 

Необработанные XML выглядит следующим образом:

<?xml version="1.0" encoding="UTF-16"?> 
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
    <RegistrationInfo> 
    <Author>MYDOMAIN\user.name</Author> 
    <Description>my description</Description> 
    </RegistrationInfo> 
    <Triggers> 
    <TimeTrigger> 
     <Repetition> 
     <Interval>PT2M</Interval> 
     <StopAtDurationEnd>false</StopAtDurationEnd> 
     </Repetition> 
     <StartBoundary>2015-09-18T09:29:14</StartBoundary> 
     <Enabled>true</Enabled> 
     <RandomDelay>PT3S</RandomDelay> 
    </TimeTrigger> 
    </Triggers> 
... 

Я экспериментировал с XPath, как это:

$ns = @{'ns'='http://schemas.microsoft.com/windows/2004/02/mit/task'} 
$xml = Select-Xml -Xml $xmldoc -XPath "//ns:Task/ns:Triggers/ns:TimeTrigger/ns:StartBoundary" -Namespace $ns 
$xml.Node.Value = $newvalue 

Но как получить путь, если все я h ave - имя узла? Есть ли способ сделать это, или мне нужно перебирать все элементы до тех пор, пока не найду имя узла?

ответ

0

Учитывая, что единственная информация, предоставленная имя тега, вы можете использовать XPath descendant-or-self ось (//) и name() -или local-name() - для соответствия целевым элементам в любом месте документа XML:

$xmlInfo = Select-Xml -Xml $xmldoc -XPath "//*[name()='StartBoundary']" 
+0

Так что мне не нужен полный путь. Я думаю, что строка не так сложна, чтобы составить все. Я нашел это введение полезным: http://www.techrepublic.com/article/use-xpath-to-locate-information-in-xml-documents/ полную спецификацию XPath здесь: http://www.w3.org/TR/XPath / – jott19

0

Измените XPath для:

$node = 'StartBoundary' 
$xmlInfo = Select-Xml -Xml $xmldoc -XPath "//ns:$node" -Namespace $ns 
$xmlInfo.Node.Value = $newvalue 
+0

Это то, с чем я экспериментировал. Я не тестировал его, но думаю, он должен работать. Проблема заключается в создании строки для '-Xpath' ... вот почему я ищу решение, которое не требует пути или метода, который его предоставляет. – jott19

+0

Итак, нет никакой реальной разницы между '' // ns: $ node "и' "// * [name() = 'StartBoundary']" "кроме последнего не требуется пространство имен. Кроме того, пост выше фактического 'compose' xpath. Укажите, какое имя элемента вы хотите в '$ node', и выражение XPath найдет его. В отличие от жесткого кодирования в «StartBoundary». –

0

Это, кажется, работает ...

[System.Xml.XmlDocument]$xmldoc = New-Object System.Xml.XmlDocument 
$xmldoc.Load($xmlfile) 
# user selects node, provides $newvalue 
[System.Xml.XmlNode]$xmlnode = $xmldoc.GetElementsByTagName($node)[0].ChildNodes[0] 
$xmlnode.InnerText = $newvalue 
$xmldoc.Save($xmlfile) 
Смежные вопросы