2013-09-16 8 views
2

Я пишу XML-парсер в C# .Net и для этого конкретного фрагмента XML. Мне сложно понять, как я буду разбирать и хранить его отношения в базе данных. См примера XML ниже:Лучший способ представления n-уровневых вложенных XML-имен с таким же именем?

<Article name="x" date="y"> 
    <Words> 
     <Category ID="1000" Name="Person"> 
      <Keyword ID="1124" Name="Adult"> 
       <Keyword ID="1125" Name="Female" /> 
      </Keyword> 
     </Category> 
     <Category ID="1000" Name="Person"> 
      <Keyword ID="1124" Name="Adult"> 
        <Keyword ID="1126" Name="Male" /> 
      </Keyword> 
     </Category> 
    </Words> 
</Article> 

Таким образом, вы можете видеть, что есть N Категории каждые из которых содержит N вложенных ключевых слов узлов. Каков наилучший способ представления этих реляционных данных?

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

  1. Таблица для всех ключевых слов/Категории: ID, имя, ParentID
  2. Таблица для статьи: ID, имя, дата,
  3. Пойдите в конец узла ключевых слов в каждом узле категории и добавьте в таблицу поиска: ID, ArticleID, KeywordID

Тогда я мог просто выполнить объединение и рекурсивно найти всех родителей самого нижнего узла ключевого слова.

+0

У вас есть xml, у вас есть таблица базы данных. Какое представление вам нужно? –

+0

На самом деле, я думаю, мой реальный вопрос заключается в том, как в C# вы попадете к последнему узлу Ключевого слова в каждом узле категории? – jethomas

+0

Вам нужно получить элементы 'Male' и' Female' из этого xml? Не получив элемент «Взрослый»? –

ответ

2

Если вы хотите получить только нижние большинство ключевых слов, то вы можете просто проверить, если ключевое слово элемент содержит дочерние узлы, прежде чем выбрать:

var xdoc = XDocument.Load(path_to_xml); 
var keywords = from k in xdoc.Descendants("Keyword") 
       where !k.Elements().Any() 
       select new 
       { 
        ID = (int)k.Attribute("ID"), 
        Name = (string)k.Attribute("Name") 
       }; 

Выход:

{ ID = 1125, Name = Female } 
{ ID = 1126, Name = Male } 

UPDATE: решение XPath получить лист Элементы ключевого слова

var keywords = xdoc.XPathSelectElements("//Keyword[not(*)]");