【问题标题】:Select XML into a XML variable in SQL Server ignoring namespaces将 XML 选择到 SQL Server 中的 XML 变量中,忽略命名空间
【发布时间】:2016-09-15 09:45:56
【问题描述】:

我有一个类似这样的 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<Model format="1" heartbeat="PT2S">
lots of other nodes.
</Model>

在尝试粉碎 xml 之前,我正在执行以下操作。但是,我只想要模型节点及其子节点等。

Declare @xml XML
set @xml = '<?xml version="1.0" encoding="utf-8"?>
    <Model format="1" heartbeat="PT2S">
    lots of other nodes.
    </Model>'

我如何只获取模型部分而忽略命名空间/指令。此 XML 实例中的指令。

例如Select @xml(删除命名空间/指令后会给我以下)

<Model format="1" heartbeat="PT2S">
    lots of other nodes.
</Model>

我使用的是 SQL Server 2014。提前致谢。

【问题讨论】:

  • 您展示的 XML 示例中没有提到命名空间。所以标题和问题令人困惑。也许“命名空间/指令”是指 XML 声明,&lt;?xml...?&gt;

标签: sql-server xml xpath xquery xml-namespaces


【解决方案1】:

如果我理解正确,你需要:

Declare @xml XML
set @xml = '<?xml version="1.0" encoding="utf-8"?>
    <Model format="1" heartbeat="PT2S">
    lots of other nodes.
    </Model>'

SELECT @xml.query('Model')

【讨论】:

    【解决方案2】:

    我不太明白你的意思:

    DECLARE @xml XML=
    '<?xml version="1.0" encoding="utf-8"?>
    <Model format="1" heartbeat="PT2S">
    <test>lots of other nodes.</test>
    </Model>';
    
    SELECT @xml;
    

    返回

    <Model format="1" heartbeat="PT2S">
        <test>lots of other nodes.</test>
    </Model>
    

    您谈到命名空间和指令。你应该知道的:

    命名空间

    如果你的 XML 有一个命名空间,你没有向我们展示这个。

    命名空间必须是

    • 被指定(至少默认命名空间xmlsn
    • 或者您必须使用通配符*:

    指令

    您的&lt;?xml version="1.0" encoding="utf-8"?&gt; 在任何情况下都将被省略。 SQL Server 在内部将 XML 存储为 unicode(即UTF-16),并且不允许您将自己的指令设置为 XML。这就是为什么简单的SELECT @xml 在没有指令的情况下返回的原因。

    有时人们会遇到特殊字符的问题,需要在文字前加上N,因为在这种情况下,引擎会因为UTF-8而抱怨:

    DECLARE @xml XML=
    N'<?xml version="1.0" encoding="utf-8"?>
    <Model>
    Test
    </Model>';
    

    这只是一个旁注......

    阅读您的 XML

    要在任何情况下获得结果,您都可以试试这个:

    假设一个现有的默认命名空间

    DECLARE @xml XML=
    '<?xml version="1.0" encoding="utf-8"?>
    <Model xmlns="tempTest" format="1" heartbeat="PT2S">
    <test>lots of other nodes.</test>
    </Model>';
    
    SELECT @xml.query('/*:Model/*');
    

    【讨论】:

      【解决方案3】:

      您可以使用value function。这将模型节点的内容作为nvarchar(max)

      select @xml.value('/Model[1]', 'nvarchar(max)') 
      

      【讨论】:

        【解决方案4】:

        模型的所有节点作为单独的行

        Declare @xml XML;
        set @xml = '<?xml version="1.0" encoding="utf-8"?>
            <Model format="1" heartbeat="PT2S">
            <lots/> <of/> <other/> <nodes./>
            </Model>';
        
        select t.n.query('.')
        from
        @xml.nodes('Model/*') t(n);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-05
          • 2015-02-18
          • 1970-01-01
          • 2016-12-18
          • 1970-01-01
          • 2019-06-12
          • 2011-05-23
          相关资源
          最近更新 更多