无法读取内容时,XML具有2个包装(Cannot read contents when XML ha

2019-09-16 20:27发布

当您删除此代码工作正常<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>母公司包装是吗?

Answer 1:

这个问题有没有关系“包装”围绕你的XML数据的数量。 的问题是:你的第一示例定义的XML命名空间xmlns="test.xsd"接通) <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命名空间声明,您的查询会工作得很好 - 两个包装器以上未在所有问题..



文章来源: Cannot read contents when XML has 2 wrappers