表示具有相同名称的n级深层嵌套XMLnode的最佳方法?

时间:2013-09-16 15:55:44

标签: c# xml xml-parsing xml-database

我正在用C#.Net编写一个XML解析器,对于这个特殊的XML块,我很难概念化如何在数据库中解析和存储它的关系。请参阅下面的示例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
  4. 然后我可以进行连接并递归查找最底层关键字节点的所有父节点。

1 个答案:

答案 0 :(得分: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 }

更新:获取叶关键字元素的XPath解决方案

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