【问题标题】:Is it possible to query a XML file with SQL?是否可以使用 SQL 查询 XML 文件?
【发布时间】:2011-02-12 07:40:09
【问题描述】:

目前我正在处理一个案例,我们不想对 c#/wpf 程序进行太多更改,但想添加一个功能。目前我们允许某些用户向数据库添加 sql 查询以检索客户数据,因此必须指定自定义连接字符串/提供商名称。有了这些信息,就可以创建连接并使用 c# 获取数据。

但是,我们希望添加允许该用户组也可以使用特定连接字符串/提供程序名称查询 XML 文件的可能性。我只是在 .net 中寻找可能性来做到这一点,但似乎找不到合适的方法......这样的事情可能吗? (也许是 OleDb/ODBC 方式?)

编辑:为了清楚起见,我想说明解决方案必须能够适应将数据源与指定的连接字符串、指定的提供程序连接并执行 SQL 查询的模式。

edit2:在查看了前三个答案后,我决定超越 XML。这篇文章似乎最好地说明了上述情况(唯一的区别是使用 XLS 而不是 XML):How to query excel file in C# using a detailed query。但是仍然欢迎使用 XML 的可能解决方案...

提前致谢。

【问题讨论】:

    标签: c# .net sql xml


    【解决方案1】:

    是的。使用 Linq2Xml

    http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx

    http://www.liquidcognition.com/tech-tidbits/linq2xml-example.aspx

    // Loading from a file, you can also load from a stream
    XDocument loaded = XDocument.Load(@"C:\contacts.xml");
    
    
    // Query the data and write out a subset of contacts
    var q = from c in loaded.Descendants("contact")
            where (int)c.Attribute("contactId") < 4
            select (string)c.Element("firstName") + “ “ +
          (string)c.Element("lastName");
    
    
    foreach (string name in q)
        Console.WriteLine("Customer name = {0}", name);
    

    【讨论】:

    • 我不明白使用 Linq 如何等同于使用 SQL 查询 XML。
    • 它不等同,但它确实达到了相同的目的。
    • 确实是一个不错的方法,但是对于这种情况,我们希望通过指定另一个连接字符串/提供者名称来解决这个问题。这样就不必更改源代码。仅供参考:选定的用户将他们的查询/连接字符串/提供程序保存到数据库中,当在程序中执行查询时再次请求此信息。
    • 您应该能够将查询的 lambda 表达式保存在数据库中。
    【解决方案2】:

    AFAIK,您不能对 XML 使用标准 sql 语句。但是您可以使用 XQuery。 它是一种用于 xml 文档的查询语言。

    http://en.wikipedia.org/wiki/XQuery
    http://www.w3schools.com/xquery/default.asp

    【讨论】:

    • 这样就得改源了,目前我喜欢寻找源代码可以保持不变的解决方案...
    【解决方案3】:

    许多 XML 库允许针对 XML 文档发出 XPath 查询,但语法与 SQL 非常不同,语义也非常不同。此外,XPath 并不像 SQL 那样真正生成结果集——它返回 XML 文档的一部分或字段的内容。我想说,如果应用程序的其余部分面向 SQL 结果集,您可能会遇到严重的阻抗不匹配。

    XPath 也比 SQL 笨得多,尽管还有另一种语言 (XQuery) 更聪明。然而,良好的 XQuery 支持在 XML 解析库中并不常见。 XQuery 的工作方式与 SQL 完全不同,因此您的用户也可能难以理解它。

    许多 DBMS 平台(包括 SQL Server)还具有支持在 SQL 查询中嵌入 Xpath 表达式的本机 XML 数据类型。使用 CROSS APPLY,您可以执行连接操作以将分层数据结构展平为 SQL 结果集。但是,这非常繁琐,您的用户可能无法使其正常工作。

    简而言之,我认为添加这种工具来查询 XML 文档可能效果不佳。

    一种选择可能是构建一个工具,用于分解 XML 文档并将内容填充到与您的应用程序具有相同结构的数据库中。这实现起来相当简单,并且不需要您的用户学习新的范例。

    【讨论】:

    • 我认为您在粉碎 XML 文档方面的解决方案将是最好的......但是它确实需要源代码实现。所以我们仍然希望有一个“连接和查询 xml”的解决方案,但猜想这将是最好的!
    【解决方案4】:

    Linq 是一种类似 SQL 的 .NET 语言,它允许您编写 SQL 风格的语句来查询很多东西。它特别允许您为 XML 文档执行此操作。

    article 对 Linq to XML 有很好的概述。

    这是一个外观/工作原理的示例

    var q = from c in xmlSource.contact
            where c.contactId < 4
            select c.firstName + " " + c.lastName;
    

    【讨论】:

    • 这不是 just LINQ to XML 的样子,当然......如果你刚刚有一个 XElement 或 XDocument 等,你将需要 Elements,后代等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 2019-01-01
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多