Строка XML - выберите только определенные узлы

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

Я знаю, как это сделать, загрузив это в XMLDocument и выбрав узлы. Есть ли лучший способ сделать это с помощью XpathNavigator или XmlReader?

Это моя строка

<root>
  <node1/>
  <node2/>
  <node3/>
  <node4/>
  <node5>
</root>

Я хочу, чтобы моя выходная строка была

<root>
   <node3/>
   <node4/>
 </root>

Должна быть выполнена эффективно.


person Vijay V    schedule 19.06.2012    source источник
comment
Итак, вы хотите удалить узлы 1, 3 и 5?   -  person user845279    schedule 20.06.2012
comment
да, но на самом деле мне, возможно, придется удалить больше узлов. Я думаю, что я хочу сказать, что может быть более 5 узлов, из которых мне нужно только 2. Также мой ввод - это строка (я знаю, что упоминал об этом в своем посте, просто подчеркнув)   -  person Vijay V    schedule 20.06.2012


Ответы (1)


Для простоты я бы использовал XDocument.Parse(). И манипулируйте DOM с помощью предоставленных функций. Поскольку XML предоставляется в виде строки, возможно небольшой, я готов поспорить, что вы не увидите проблем со сложностью.

Если нужно удалить много узлов, я предлагаю вам использовать список строк XPath. Затем для каждой строки вы можете использовать doc.XPathSelectElements(), чтобы найти все элементы и вызвать remove() для каждого из них. Результирующий XDocument будет иметь только оставшиеся узлы.

person user845279    schedule 20.06.2012
comment
Спасибо за ответ. однако, даже если я получу часть XDocument, какие методы я буду использовать для достижения того, чего хочу? - person Vijay V; 20.06.2012
comment
это то, что я пробовал, но он удаляет все, кроме корневого XDocument x = XDocument.Parse(xmlstring); x.Root.Elements().Where(e =› e.Name != node3 || e.Name != node4).Remove(); - person Vijay V; 20.06.2012
comment
Могу ли я задать больше вопросов здесь или мне нужно открыть другой форум. (Я хочу добавить атрибуты к ‹node4/› на основе ‹node3/›) - person Vijay V; 20.06.2012
comment
Вы должны открыть другой вопрос, чтобы получить подробную справку. Но общая идея состоит в том, чтобы выбрать оба элемента, а затем вызвать setAttributeValue() на node3. - person user845279; 20.06.2012