c# - 表示具有相同名称的 n 层深度嵌套 XML 节点的最佳方式?

标签 c# xml xml-parsing xml-database

我正在 C# .Net 中编写一个 XML 解析器,对于这个特定的 XML block ,我很难概念化如何解析它的关系并将其存储在数据库中。请参阅下面的示例 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

然后我可以进行连接并递归地查找最底部关键字节点的所有父节点。

最佳答案

如果您只想获取最底部的关键字,那么您可以在选择关键字元素之前简单地检查关键字元素是否包含任何子节点:

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(*)]");

关于c# - 表示具有相同名称的 n 层深度嵌套 XML 节点的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18832329/

相关文章:

c# - 对数组执行浅复制以调整数组大小有何影响?

c# - 在另一个 View 模型中执行命令?

c# - xml 错误 : Object reference not set to an instance of an object after SelectSingleNode

Android ListView 刷新

java - org.xml.sax.SAXParseException : Premature end of file for *VALID* XML

c# - db.SaveChanges 的 System.OutOfMemoryException Entity Framework 6

javascript - 如何将 List<string> 分配给 ViewBag 并在 JavaScript 中使用?

c# - MsBuild XmlPeek 结果拆分值

javascript - IE 6、7、8 中的 Ajax 问题

java - 从 Wikipedia XML 转储中提取表