【问题标题】:XPath Query to find supplier name through an XML table通过 XML 表查找供应商名称的 XPath 查询
【发布时间】:2017-12-05 23:47:10
【问题描述】:

我正在尝试找出供应商名称为 Herman 的城市。我们通过 Microsoft SQL Server Management Studio 使用 XPath。

我不是 CIS 专业的,我不知道从哪里开始。所以这就是我寻求帮助的原因......

我创建了下表:

CREATE TABLE Tb_Supplier(
XMLColumn XML)
GO

INSERT Tb_Supplier VALUES(
    '<SuppliersList>
      <Supplier name="Joe">
        <City>Paris</City>
        <Product name="Airplane"/>
        <Product name="Milk"/>
        <Product name="TV"/>
        <Product name="Orange"/>
     </Supplier>
      <Supplier name="Herman">
        <City>Chicago</City>
        <Product name="Orange"/>
     </Supplier>
     <Supplier name="Bernstein">
        <City>Madison</City>
        <Product name="Truck"/>
        <Product name="TV"/>
      </Supplier>
     <Supplier name="Hunter">
        <City>Wausau</City>
      </Supplier>
      <Supplier name="Mayer">
        <City>Madison</City>
      </Supplier>
      <Supplier name="Rosenfeld">
        <City>Chicago</City>
        <Product name="Computer"/>
        <Product name="Book"/>
        <Product name="Truck"/>
      </Supplier>
    </SuppliersList>');

输出应该显示:

<City>Chicago</City>

我通过以下方式让它工作:

SELECT XMLColumn.query('/SuppliersList/Supplier[@name="Herman"]/City')
FROM Tb_Suppliers

我有点掌握了一些东西。 目前我很难找到以下内容: 列出产品是电视,并且在麦迪逊提供。 显然输出将是因为它正在寻找电视。

到目前为止,我有这个,我不知道我做错了什么,因为这对我来说最有意义。

SELECT XMLColumn.query('/SuppliersList/Supplier/Product[@name="TV"]/../City[@name="Madison"]/../Product')
FROM Tb_Suppliers

【问题讨论】:

  • 如果有的话,您尝试过什么?没有人会为你编写代码。
  • 我什至不知道从哪里开始说实话。我不是 CIS 专业的,但我被困在这门课上,因为评论很好,除了 sql 的东西,我几乎掌握了所有东西。
  • 不好告诉你怎么做,但我会给你一些提示。 msdn.microsoft.com/en-us/library/… /* 查找拥有卡车产品的供应商 */ SELECT XMLColumn.query('/SuppliersList/Supplier/Product[@name="Truck"]/..') from Tb_Supplier
  • 请避免后续问题!如果最初的问题得到解决,您应该通过接受他最有帮助的答案来结束这个问题。然后将您的新问题作为新问题。这将拉动新的吸引力。没有人会在这里阅读您的编辑(我偶然发现它们......)简而言之:将过滤器谓词放在更高的节点而不是向后导航。

标签: sql-server sqlxml


【解决方案1】:

这取决于您是否知道,您的列表中只有一个“Herman”。然后它是对.value() 的纯粹调用,带有适当的XPath

SELECT XMLColumn.value(N'(/SuppliersList/Supplier[@name="Herman"]/City/text())[1]',N'nvarchar(max)') AS Herman_City
FROM Tb_Supplier 

如果您期望不止一个,则需要.nodes() 来获取派生表,并在相对路径上使用value()(在来自.nodes() 的节点下方):

SELECT AllHerman.cities.value(N'(City/text())[1]',N'nvarchar(max)') AS Herman_City
FROM Tb_Supplier
CROSS APPLY XMLColumn.nodes(N'/SuppliersList/Supplier[@name="Herman"]') AS AllHerman(cities) 

【讨论】:

    【解决方案2】:

    不好告诉你怎么做,但我会给你一些提示。 https://msdn.microsoft.com/en-us/library/ms189075%28SQL.90%29.aspx?f=255&MSPPError=-2147217396

    /* find Supplier who have truck-product */ 
        SELECT XMLColumn.query('/SuppliersList/Supplier/Product[@name="Truck"]/..') from Tb_Supplier
    

    @ 符号表示“属性”。该 url 显示了如何查询元素值(语法与属性略有不同)。

    “/”表示向下(或有时向上)导航层次结构。

    “..”表示“将层次结构备份一级”。

    这应该足以让你继续前进。

    【讨论】:

    • 谢谢,XPath我知道的够多了,只是不知道怎么用sql查询。
    • 所以我的代码展示了神奇的语法糖。 "从 MyTable 中选择 MyXmlColumn.query('myxpath')。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    相关资源
    最近更新 更多