xml - 当 XML 有 2 个包装器时无法读取内容

标签 xml sql-server-2008 xquery

当您删除 <data> 时,这段代码工作正常包装器,来自 XML 和节点,但是当您添加它时,如下所示,我得到 0 个结果。

  -- Declare XML variable
  DECLARE @data XML;

  -- Element-centered XML
  SET @data =
  N'
  <data xmlns="test.xsd">
    <subdata>
      <customer>
        <id>1</id>
        <name>Allied Industries</name>
      </customer>
      <customer>
        <id>2</id>
        <name>Trades International</name>
      </customer>
    </subdata>
  </data>';

  -- Using the query() method
  SELECT T.customer.query('id').value('.', 'INT') AS customer_id,
         T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name
  FROM @data.nodes('data/subdata/customer') AS T(customer);

但是当我这样做时效果很好:

  -- Element-centered XML
  SET @data =
  N'
    <subdata>
      <customer>
        <id>1</id>
        <name>Allied Industries</name>
      </customer>
      <customer>
        <id>2</id>
        <name>Trades International</name>
      </customer>
    </subdata>
 ';

  -- Using the query() method
  SELECT T.customer.query('id').value('.', 'INT') AS customer_id,
         T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name
  FROM @data.nodes('subdata/customer') AS T(customer);

有谁知道我在第一个示例中如何或为什么没有得到结果,当 <data>父包装器在吗?

最佳答案

问题与 XML 数据周围的“包装器”数量无关。问题是:您的第一个示例在 xmlns="test.xsd" 上定义了一个 XML 命名空间 ( <data> )节点,但您的查询没有考虑到这一点。

您需要将查询更改为如下所示:

-- Using the query() method
;WITH XMLNAMESPACES (DEFAULT 'test.xsd')
SELECT 
    T.customer.query('id').value('.', 'INT') AS customer_id,
    T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name
FROM 
    @data.nodes('data/subdata/customer') AS T(customer);

然后你会得到结果......

如果没有这个 XML 命名空间声明,您的查询将正常工作 - 两个包装器或更多包装器根本无关紧要..

关于xml - 当 XML 有 2 个包装器时无法读取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10375609/

相关文章:

javascript - 读取 XML 文件,在 IE 上运行正确,但在 Firefox 上运行不正确

java - JAXB - 检查是否存在子元素

sql-server-2008 - SQL Server 网络服务帐户权限

xml - 这两个 XQuery 之间有什么区别

xml - 排除 XQuery 中的元素

java - 如何从 Java 中的 XMLUnit 测试中删除属性?

xml - xPath 帮助 - 选择字符串中的特定单词

c# - SQL Server 2008 错误 - XML 分析 : document parsing required too much memory

sql - T-SQL 语句不会接受变量作为授权语句中的角色名称

xml - 如何从 FLOWR xquery 指定 BaseX 数据库?