Скопировать нужные XElement'ы и ничего лишнего
Подскажите, есть ли штатные средства в C#, чтобы я мог передав какой-нибудь XPath, скопировать всю иерархию с атрибутами, значениями и ничего лишнего.
Скажем, передаю такой XPath: root/TableRow/Id
и пусть там помимо TableRow в root'е есть другие узлы, он их не возьмет.
Или нужно самому ручками все обходить, начиная с последнего элемента и строить свою копию по-узлам?
Ответы (1 шт):
Автор решения: VladD
→ Ссылка
Ну, прямо в лоб такого нету, но можно сделать не сильно напрягаясь.
Пример:
<?xml version="1.0" encoding="utf-8" ?>
<Root>
<Table Name="First">
<TableRow>
<id>1</id>
<age>20</age>
<name>John</name>
</TableRow>
<TableRow>
<id>2</id>
<age>21</age>
<name>Johann</name>
</TableRow>
</Table>
<Table Name="Second">
<TableRow>
<id>3</id>
<age>22</age>
<name>Jean</name>
</TableRow>
</Table>
<NotTable Name="Third">
<TableRow>
<id>4</id>
<age>23</age>
<name>Giovanni</name>
</TableRow>
</NotTable>
</Root>
Вот такой код:
XDocument doc = ...
var clone = new XDocument(doc); // deep clone
var selectedElements =
clone.XPathSelectElements("/Root//TableRow/id") // выберем те элементы, которые нужно
.AncestorsAndSelf() // и их предков
.ToHashSet(); // и соберём в множество для эффективного поиска
// остальные удалим
clone.Descendants().Where(d => !selectedElements.Contains(d)).Remove();
производит такой XML:
<?xml version="1.0" encoding="utf-8" ?>
<Root>
<Table Name="First">
<TableRow>
<id>1</id>
</TableRow>
<TableRow>
<id>2</id>
</TableRow>
</Table>
<Table Name="Second">
<TableRow>
<id>3</id>
</TableRow>
</Table>
</Root>
Возможно, более правильное решение — использовать XSLT (но я его не знаю).