代码之家  ›  专栏  ›  技术社区  ›  Herman Cordes

可以用sql查询xml文件吗?

  •  3
  • Herman Cordes  · 技术社区  · 14 年前

    目前,我正在处理一个案例,我们不想在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的可能解决方案…

    提前谢谢。

    4 回复  |  直到 14 年前
        1
  •  0
  •   ConcernedOfTunbridgeWells    14 年前

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

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

    许多dbms平台(包括sql server)也有一个原生xml数据类型,支持在sql查询中嵌入xpath表达式。使用cross-apply,您可以执行连接操作,将分层数据结构扁平化为sql结果集。然而,这是相当烦琐的,你的用户可能有困难,使它正常工作。

    简而言之,我认为添加这种工具来查询xml文档可能不会很好地工作。

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

        2
  •  4
  •   this. __curious_geek    14 年前

    对。使用 LIQ2XML

    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);
    
        3
  •  1
  •   nWorx    14 年前

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

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

    高温高压

        4
  •  -1
  •   Chris    14 年前

    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;