2016-07-04 2 views
1

У меня есть следующий XML дерева:Powershell: добавить дочерний узел в XML

<company> 
    <employees> 
    <employee name="Dwight" id="e1000" department="sales"> 
    </employee> 
    <employee name="Toby" id="e1001" department="hr"> 
    </employee> 
    <employee name="Jim" id="e1002" department="sales"> 
    </employee> 
    </employees> 
</company> 

И я пытаюсь добавить новый сотрудник по имени Пэм, ID = «e1003» при кафедре = «приема».

Это то, что я пытался до сих пор:

$fileName = "C:\code\employees.xml"; 

$xmlDoc = [System.Xml.XmlDocument](Get-Content $fileName); 
$newXmlEmployee = $xmlDoc.employees.AppendChild($xmlDoc.CreateElement("employee")); 
$newXmlEmployee.SetAttribute("name","Pam"); 
$newXmlEmployee.SetAttribute("id","e1003"); 
$newXmlEmployee.SetAttribute("department","reception"); 

$xmlDoc.Save($fileName); 

Однако я поздоровался со следующими сообщениями об ошибках:

You cannot call a method on a null-valued expression. At C:\code\testing.ps1:6 char:48 + $newXmlEmployee = $xmlDoc.employees.AppendChild <<<< ($xmlDoc.CreateElement("employee")); + CategoryInfo : InvalidOperation: (AppendChild:String) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression. At C:\code\testing.ps1:7 char:29 + $newXmlEmployee.SetAttribute <<<< ("name","Pam"); + CategoryInfo : InvalidOperation: (SetAttribute:String) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression. At C:\code\testing.ps1:8 char:29 + $newXmlEmployee.SetAttribute <<<< ("id","e1003"); + CategoryInfo : InvalidOperation: (SetAttribute:String) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression. At C:\code\testing.ps1:9 char:29 + $newXmlEmployee.SetAttribute <<<< ("department","reception"); + CategoryInfo : InvalidOperation: (SetAttribute:String) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull

Как бы решить эту проблему?

ответ

0

Вы почти получили его. Вы просто пропустили company узел, в котором вы выбираете employees:

$fileName = "C:\code\employees.xml"; 

$xmlDoc = [xml](Get-Content $fileName); 
$newXmlEmployee = $xmlDoc.company.employees.AppendChild($xmlDoc.CreateElement("employee")); 
$newXmlEmployee.SetAttribute("name","Pam"); 
$newXmlEmployee.SetAttribute("id","e1003"); 
$newXmlEmployee.SetAttribute("department","reception"); 

$xmlDoc.Save($fileName); 

Выход:

<company> 
    <employees> 
    <employee name="Dwight" id="e1000" department="sales"> 
    </employee> 
    <employee name="Toby" id="e1001" department="hr"> 
    </employee> 
    <employee name="Jim" id="e1002" department="sales"> 
    </employee> 
    <employee name="Pam" id="e1003" department="reception" /> 
    </employees> 
</company> 
+0

Благодаря @Martin! Теперь мне нужно добавить дочерний узел под узлом employee, я попробовал: $ newXmlEmployee = $ xmlDoc.company.employees.employee.AppendChild ($ xmlDoc.CreateElement («адрес»)); но я закончил с этой ошибкой: Ошибка вызова метода, потому что [System.Object []] не содержит метода с именем «AppendChild» - вложенные узлы обрабатываются по-разному? – pinkie

+0

Это потому, что есть несколько узлов-сотрудников - вам нужно выбрать тот, который вы хотите создать. Примите этот ответ и задайте другой вопрос, если вы не получите его на работу. –

Смежные вопросы