2013-05-23 3 views
0

Предполагая, имеющей следующий XMLподкачка узлы в XmlNodeList C#

<test> 
    <step> 
     <var name="name1" /> 
     <var name="name2" /> 
    </step> 

    <step> 
     <var name="name3" /> 
     <var name="name4" /> 
    </step> 

    <step> 
     <var name="name5" /> 
     <var name="name6" /> 
    </step> 

</test> 

Я использую XmlNodeList, разделенный "шаг". Есть ли способ поменять или заменить шаг непосредственно в xmlnodelist?

нужно сделать это следующим образом:

<test> 
    <step> 
     <var name="name3" /> 
     <var name="name4" /> 
    </step> 

    <step> 
     <var name="name1" /> 
     <var name="name2" /> 
    </step> 

    <step> 
     <var name="name5" /> 
     <var name="name6" /> 
    </step> 

</test> 
+0

На самом деле я не могу найти способ, чтобы заставить его работать, все я загрузил файл XML с помощью XML = новый XmlDocument(); , а затем xmlList = xml.GetElementsByTagName ("step"); – user2029200

+0

Как вы различаете разные «шаги»? – Corak

+0

xmlList = xml.GetElementsByTagName ("step"); – user2029200

ответ

3

Вы можете использовать XDocument класс вместо XMLDocument. Это заменит узлы var node3 на name6.

using System.Linq; 
using System.Xml.Linq; 
class Test 
{ 

    static void Main() 
    { 
     XDocument document = XDocument.Load("test.xml"); 
     Swap("name3", "name6", document); 
     document.Save("test.xml"); 
    } 

    static void Swap(string nameOne, string nameTwo, XDocument document) 
    { 
     var nameOneNode = document.Descendants("var").FirstOrDefault(p => p.Attribute("name").Value == nameOne); 
     var nameTwoNode = document.Descendants("var").FirstOrDefault(p => p.Attribute("name").Value == nameTwo); 
     nameOneNode.Attribute("name").Value = nameTwo; 
     nameTwoNode.Attribute("name").Value = nameOne; 
    } 
} 
+1

Я бы рекомендовал 'XElement', но это тоже работает. – gunr2171

+0

@ Downvoter: Заметь прокомментировать? – cvraman

+1

Не нисходящий, но я предполагаю, что это слишком специфично для решения (?). Может быть, потому, что он будет обрабатывать только первый слой внутренних узлов и только их атрибуты «имя». Но любой хороший программист должен знать, что его нужно модифицировать, чтобы соответствовать их потребностям. – gunr2171

1

Порядок узлов в файле XML не обязательно должен сохраняться при чтении XML-файла. Например, если ваш файл выглядит следующим образом:

<xmlcontent> 
    <node value="Hello" /> 
    <node value="World" /> 
</xmlcontent> 

XML-чтение может возвращать узлы, как это:

<xmlcontent> 
    <node value="World" /> 
    <node value="Hello" /> 
</xmlcontent> 

Чтобы применить что-то вроде «порядок» в узлах XML, вам нужно добавить атрибут можно сортировать, как

<xmlcontent> 
    <node index="1" value="Hello" /> 
    <node index="2" value="World" /> 
</xmlcontent> 

в этом случае, «замена» два элемента сведется к поменяв значение индекса.

+0

Проблема в том, что узлы находятся в xmlnodelist, который каким-то образом ограничивается любым типом подкачки. Порядок, в котором C# загружает узлы в списке, такой же, как в xml-файле – user2029200

+0

Другой способ для моего решения, как заменить узел в списке узлов xml другим узлом. Это решит мою проблему. – user2029200

0

Наконец удалось сделать это, вот код:

 XmlDocument xml; 
     XmlNodeList xmlList; 

     xml = new XmlDocument(); 
     xml.Load(path); 

     xmlList = xml.GetElementsByTagName("step"); 

     XmlNode refNode = xmlList[1]; 

     XmlNode newNode = xmlList[0]; 

     xml.DocumentElement.InsertAfter(newNode, refNode); 
+0

Отметьте соответствующий ответ как ответ, если это поможет вам решить ваш вопрос. – cvraman

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