sql-server - SQL XPath 查询按属性查找节点值

标签 sql-server xml xpath

我指的是How to get a particular attribute from XML element in SQL Server .

我没有包含节点值的特定属性,而是根据我要查找的属性来查找节点的值。

我从 SQL 表中的 XML 列中进行选择,但为了简单起见,我可以提供以下示例:

DECLARE @xml xml = CONVERT(XML, '<?xml version="1.0" encoding="UTF-8"?>
<alert>
   <hits>
      <elem name="hit">
         <elem name="scoreFactors">
            <elem name="scoreFactors">
               <elem name="factorId">FactorID 1</elem>
               <elem name="factorDesc">FactorDesc 1</elem>
               <elem name="factorValue">FactorValue 1</elem>
               <elem name="factorScore">FactorScore 1</elem>
               <elem name="factorImpact">FactorImpact 1</elem>
            </elem>
            <elem name="scoreFactors">
               <elem name="factorId">FactorID 2</elem>
               <elem name="factorDesc">FactorDesc 2</elem>
               <elem name="factorValue">FactorValue 2</elem>
               <elem name="factorScore">FactorScore 2</elem>
               <elem name="factorImpact">FactorImpact 2</elem>
            </elem>
         </elem>
       </elem>
   </hits>
</alert>')

SELECT @xml.value('(/alert/hits/elem/elem[@name="factorDesc"])[1]', 'nvarchar(max)')

我返回的只是一个NULL值,但我期望有 2 行分别以 FactorDesc 1FactorDesc 2 作为值.

我做错了什么?

最佳答案

您要查找的属性位于 <elem>第四级别。 - 所以你需要使用这个XPath:

SELECT @xml.value('(/alert/hits/elem/elem/elem/elem[@name="factorDesc"])[1]', 'nvarchar(max)')

或者使用此 XPath(但是注意:如果您的 XML 有大量 <elem> 节点,这可能会 killer 性能!您已经警告!)

SELECT @xml.value('(/alert/hits//elem[@name="factorDesc"])[1]', 'nvarchar(max)')

更新:如果您想要所有带有 factorDesc 的节点名称,您可以使用类似以下内容:

;WITH Shredded AS
(
    SELECT 
        ElemName = xc.value('@name', 'varchar(50)'),
        ElemValue = xc.value('.', 'varchar(50)') 
    FROM
        @xml.nodes('/alert/hits//elem') AS XT(XC)
)
SELECT *
FROM Shredded
WHERE Shredded.ElemName = 'factorDesc'

关于sql-server - SQL XPath 查询按属性查找节点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31936911/

相关文章:

sql-server - 在查询的 DATEADD 函数中使用参数

sql-server - SQL Server 查询 - 使用空格按钮插入@space

java - 使用 Selenium WebDriver 在元素内查找时结果太多

用于匹配名称以 X 开头的任何属性的 XPath 查询

sql-server - NOT IN 的 SQL 优化代码

sql-server - 如何将 int 集以字符串形式传递给 sqlserver 存储过程并在 IN 子句中使用它

java - 如何获取发送到 JMETER 中 ISO8583 采样器服务器的字节数组?

xml - Jaxb2Marshaller cvc-elt.1 : Cannot find the declaration of element even though the class element is known

ios - 将 C 指针复制到 NSMutableDictionary

java - 通过遍历<tr id>从后代标签的getAttribute中获取ID,然后遍历到td,然后输入标签以获取其id