使用通配符查找元素的名称

时间:2015-04-08 08:29:49

标签: xml tsql xquery wildcard

我正在尝试使用通配符*使用TSQL读取xml元素名称,但我无法使其工作:下面的查询返回空白,试图读取名为'xs_address'的元素

<TestXML>
<Properties />
  <Body>
    <xs_name Type="text" Value="John Smith" />
    <xs_address Type="text" Value="123 Fake Street" />
    </Body>
</TestXML>

查询:

SELECT 
     @x.value('local-name((/TestXML/Body/*:_address)[1])','VARCHAR(30)') AS ElementName

我需要阅读的元素有时在下划线之前有不同的名称,例如dis_address

我如何确保始终阅读正确的元素?

1 个答案:

答案 0 :(得分:1)

尝试以下方法之一:

DECLARE @x XML=N'<TestXML>
  <Properties />
  <Body>
    <xs_name Type="text" Value="John Smith" />
    <xs_address Type="text" Value="123 Fake Street">abc</xs_address>
  </Body>
</TestXML>'

SELECT ElementName FROM (
    SELECT c.value('local-name(.)','varchar(30)') AS ElementName 
    FROM @x.nodes('/TestXML/Body/*') T(c)
) q WHERE ElementName LIKE '%[_]address'

SELECT @x.value('local-name((/TestXML/Body/*)
[contains(local-name(),"_address")]
[1])','varchar(30)') AS ElementName 

SELECT @x.value('local-name((/TestXML/Body/*)
[substring(local-name(),string-length(local-name())-7,8)="_address"]
[1])','varchar(30)') AS ElementName 

稍后编辑:

在某些情况下,这三个查询的结果略有不同:

  • 第一个查询提取/ TestXML / Body中所有元素的名称,然后使用WHERE条件查找以&#34; _address&#34;结尾的那些元素。
  • 第二个查询使用X-Query条件查找名称中包含&#34; _address&#34;的第一个元素。
  • 第二个查询使用X-Query条件查找名称以&#34; _address&#34;结尾的第一个元素。