【问题标题】:TSQL-failing to parse XML(namespaces)TSQL 无法解析 XML(命名空间)
【发布时间】:2017-07-01 14:02:47
【问题描述】:

这是我的 SQL:

    create table sqm (data xml)    
    insert into sqm
    select '<DataSet xmlns="http://www.bnr.ro/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bnr.ro/xsd nbrfxrates.xsd">
            <Cube date="2017-06-30">
                <Rate currency="AED">1.0867</Rate>
                <Rate currency="AUD">3.0665</Rate>
                <Rate currency="BGN">2.3284</Rate>
            </Cube>
            </DataSet>'

    select
    m.c.value('@date', 'date') as valuta
    from sqm as s
    outer apply s.data.nodes('/DataSet/Body/Cube') as m(c)

在花了几个小时试图找出为什么我的 SQL 在数据库中一直返回 NULL 之后,我发现我的问题是由于 XML 开头的超链接引用(在 DataSet 之后)。 我真的很想知道为什么会这样,我可以删除&lt;DataSet&gt; 之间的所有内容。还有其他选择吗?

如果您能想到更好的标题,请编辑。

【问题讨论】:

    标签: sql sql-server xml tsql


    【解决方案1】:

    您需要使用WITH XMLNAMESPACES 声明命名空间

    您的示例 XML 也没有 Body 元素,所以我从 Xpath 中删除了它。

    Demo

    WITH XMLNAMESPACES (DEFAULT 'http://www.bnr.ro/xsd')  
    
    select
    m.c.value('@date', 'date') as valuta
    from sqm as s
    outer apply s.data.nodes('/DataSet/Cube') as m(c)
    

    或者你也可以使用

    select
    m.c.value('@date', 'date') as valuta
    from sqm as s
    outer apply s.data.nodes('/*:DataSet/*:Cube') as m(c)
    

    【讨论】:

    • 我明白了,但是当我从here 这样的 URL 解析 xml 时,命名空间应该放在哪里提前谢谢。
    • @s.dragos 它必须是使用 Xpath 的同一语句的一部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2014-01-10
    相关资源
    最近更新 更多