【问题标题】:Selecting a node's atomic value on typed xml columns在类型化的 xml 列上选择节点的原子值
【发布时间】:2012-08-24 18:42:35
【问题描述】:

如果不能在类型化的 xml 列中使用 text(),如何获取元素的原子值?

这个查询;

-- Add schema
CREATE XML SCHEMA COLLECTION MySchema AS N'<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            attributeFormDefault="unqualified"
            elementFormDefault="qualified"
            xmlns="http://mynamespace"
            targetNamespace="http://mynamespace">

  <xs:element name="element1" type="element1Type">
  </xs:element>

  <xs:complexType name="element1Type">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="element2" type="element2Type" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="element2Type">
    <xs:sequence>
      <xs:element name="element3" type="element3Type" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="element3Type">
    <xs:sequence minOccurs="0">
      <xs:element minOccurs="0" name="element4" />
    </xs:sequence>
  </xs:complexType>

</xs:schema>'
GO

-- Create table
CREATE TABLE [dbo].[MyTable](
    [XmlColumn] [xml](CONTENT [dbo].[MySchema]) NOT NULL
)
GO

-- Add test data
INSERT INTO MyTable SELECT N'<element1 xmlns="http://mynamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <element2>
    <element3>
      <element4>my text here</element4>
    </element3>
  </element2>
</element1>'
GO

-- run query
WITH XMLNAMESPACES(
    'http://mynamespace' as s,
    DEFAULT 'http://mynamespace'
)
SELECT 
    T.rows.value('(element3/element4)[1]/text()', 'varchar(100)') as [AtomicValue]
FROM
    MyTable
CROSS APPLY
    XmlColumn.nodes('/element1/element2') T(rows)

结果;

XQuery [MyTable.XmlColumn.value()]: 'text()' 不支持简单类型或
'http://www.w3.org/2001/XMLSchema#anyType' 元素,找到
'元素({http://mynamespace}:element4,xs:anyType)?'。

我已经阅读了this,但是在我希望能够阅读的每个原子值上大规模编辑架构感觉有点矫枉过正......

【问题讨论】:

  • 如果您可以添加您使用的架构和显示错误的示例 XML,将会很有帮助。
  • 是的,看看结构就好了。
  • 您尝试使用 item() 还是 node() 而不是 text()
  • @Mikael 添加了完整的复制查询
  • @András 使用 node() 返回相同的异常。我不确定 item() 的语法...

标签: sql sql-server-2008 xpath


【解决方案1】:

您可以使用query,然后使用value

WITH XMLNAMESPACES(
    'http://mynamespace' as s,
    DEFAULT 'http://mynamespace'
)
SELECT 
    T.rows.query('element3/element4').value('.', 'varchar(100)')
FROM
    MyTable
CROSS APPLY
    XmlColumn.nodes('/element1/element2') T(rows)

或者您可以在架构中指定element4 的类型。

<xs:element minOccurs="0" name="element4" type="xs:string"/>

并使用此查询

WITH XMLNAMESPACES(
    'http://mynamespace' as s,
    DEFAULT 'http://mynamespace'
)
SELECT 
    T.rows.value('(element3/element4)[1]', 'varchar(100)') as [AtomicValue]
FROM
    MyTable
CROSS APPLY
    XmlColumn.nodes('/element1/element2') T(rows)

【讨论】:

    猜你喜欢
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多