2013-08-22 2 views
0

Есть ли хороший способ в C# просмотреть список узлов XML с помощью DOM и получить список узлов только из уникальных узлов, а также список уникальных возможных атрибутов каждого узла.Уникальные узлы и C#

В файле XMl есть узлы с тем же именем, но с разными атрибутами, я хочу список всех возможных. Кроме того, список узлов, которые я хотел бы быть только из уникальных узлов, а не повторений (так что списки узлов, которые я генерирую в данный момент, могут иметь контакт дважды, три временных интервала в нем). И он должен работать для любого XML-документа. Есть идеи?

Вот пример:

<book id="bk112"> 
    <author>Galos, Mike</author> 
    <title>Visual Studio 7: A Comprehensive Guide</title> 
    <genre>Computer</genre> 
    <price>49.95</price> 
    <publish_date>2001-04-16</publish_date> 
</book> 
<book id="bk162"> 
    <genre>fiction</genre> 
    <popularity>High</popularity> 
    <price>20.00</price> 
    <publish_date>2002-03-12</publish_date> 
</book> 
<cd id="bk162"> 
    <genre>jaz</genre> 
    <popularity>High</popularity> 
    <price>10.00</price> 
</cd> 

и получить какой-то выход, как:

there are 2 of the type book 
there are 1 of the type cd 
there are 3 of the type genre 
book may have the attributes author, title, genre, price, popularity, publish_date 

, но таким образом, что работает для любого файла XML.

В случае с жанром он не должен быть celver в любом случае, просто знаю, что в документе есть 3 жанровых узла.

+0

образец xml и ожидаемый выход и, конечно, что вы пробовали? – Ehsan

+0

См. 'HtmlAgilityPack',' IEqualityComparer '. –

+0

Не могли бы вы привести пример XML, чтобы сделать ваш вопрос более ясным? Что считается уникальным? то есть. Если контактный узел появляется на разных уровнях XML-документа, он все еще является дубликатом? – aaroncatlin

ответ

0

Будет ли это делать?

XDocument xDoc = XDocument.Load("XMLFile1.xml"); 
List<XElement> distinctDocs = xDoc.Descendants().GroupBy(x => x.Name).Where(x => x.Count() == 1).Select(g => g.Single()).ToList(); 
+0

Не думайте так, если я не пропущу что-то. У меня нет имен узлов до времени выполнения – user2707220

+0

@ user2707220 Это решение не требует, чтобы у вас были имена во время выполнения. Почему бы вам не запустить его, установить перебор и проверить, что находится в 'distinctDocs' var –

+0

@ user2707220 Я отредактировал свой ответ, чтобы избежать путаницы типа. попробуйте его –

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