草庐IT

xml - 在 T-SQL 中解析包含多个 xmlns 的 xml

coder 2024-07-01 原文

我在使用 OPENXML 解析具有两个嵌套 xmlns namespace (两者相同)的 XML 文件时遇到问题。

我已经阅读了很多资料,包括 this topic on stackexchange,但它对我的情况没有帮助。下面我粘贴了一些 XML 代码(抱歉,所有字段都是波兰语,因为它是来自银行网络服务的响应)。如果我选择 DaneZapytaniaFin 对象

;WITH XMLNAMESPACES(DEFAULT 'http://bik.pl/cc/big')
SELECT * FROM OPENXML(@idoc, '/BIGIMResponse/DaneZapytaniaFin')

我得到了其中的所有值。

但是当我试图得到例如。名称字段

;WITH XMLNAMESPACES(DEFAULT 'http://bik.pl/cc/big')
SELECT * FROM OPENXML(@idoc, '/BIGIMResponse/DaneZapytaniaFin/dane-id-kons/imie') 

只有我得到的是空值。

当我试图获取它的父节点 dane-id-kons 时也是如此

;WITH XMLNAMESPACES(DEFAULT 'http://bik.pl/cc/big')
SELECT * FROM OPENXML(@idoc, '/BIGIMResponse/DaneZapytaniaFin/dane-id-kons')

它是空的。

有人可以给我一些如何获得这些值的建议吗?提前致谢!

我的 XML 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<BIGIMResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <DaneZapytaniaFin>
        <forma-pr-podm forma-pr-podm="01" xmlns="http://bik.pl/cc/big" />
        <dane-id-kons form-przek-nazw-i-im="01" imie="NAME" nazw="SURNAME" pesel="1234567890" rodz-dok-tozs="ID" seria-nr-dok-tozs="ABC123456" obywatelstwo="PL" xmlns="http://bik.pl/cc/big" />
        <daty-upow data-up-15-1="2019-11-22T00:00:00" data-up-24-1="2019-11-22T00:00:00" data-up-bik="2019-11-22T00:00:00" data-up-zbp="2019-11-22T00:00:00" xmlns="http://bik.pl/cc/big" />
    </DaneZapytaniaFin>
</BIGIMResponse>

我直接从文件路径读取它,例如:

create table #p_TempDM (dane xml)
declare @idoc INT
declare @sql varchar(max) 
    set @sql = '
        insert into #p_TempDM select CONVERT(xml, bulkcolumn, 2) imp from
        openrowset (bulk '''+@filePath+''', single_blob) as dane
        '
        exec (@sql)

declare @x xml

select @x =      dane from  #p_TempDM   
                 EXEC sp_xml_preparedocument
                 @idoc OUTPUT,
                 @x;         

最佳答案

请记住,FROM OPENXML 已过时,不应再使用。还有更强大的 native XML-methods

试试这个

您的 XML

DECLARE @xml XML=
'<?xml version="1.0" encoding="utf-8"?>
<BIGIMResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <DaneZapytaniaFin>
        <forma-pr-podm forma-pr-podm="01" xmlns="http://bik.pl/cc/big" />
        <dane-id-kons form-przek-nazw-i-im="01" imie="NAME" nazw="SURNAME" pesel="1234567890" rodz-dok-tozs="ID" seria-nr-dok-tozs="ABC123456" obywatelstwo="PL" xmlns="http://bik.pl/cc/big" />
        <daty-upow data-up-15-1="2019-11-22T00:00:00" data-up-24-1="2019-11-22T00:00:00" data-up-bik="2019-11-22T00:00:00" data-up-zbp="2019-11-22T00:00:00" xmlns="http://bik.pl/cc/big" />
    </DaneZapytaniaFin>
</BIGIMResponse>';

-- 在这种情况下,我声明了默认命名空间,但是 - 重要的是要看! - 前两个级别不在这个默认命名空间内(它是在更深的级别上声明的)。为了解决这个问题,我使用了命名空间通配符(就像这里的/*:BIGIMResponse)。一般来说,不推荐这样做,但在这里似乎可以接受。您可以使用这种方法分别处理每个值并键入:

WITH XMLNAMESPACES(DEFAULT 'http://bik.pl/cc/big')
SELECT @xml.value('(/*:BIGIMResponse/*:DaneZapytaniaFin/forma-pr-podm/@forma-pr-podm)[1]','int')
      ,@xml.value('(/*:BIGIMResponse/*:DaneZapytaniaFin/dane-id-kons/@form-przek-nazw-i-im)[1]','int') 
      ,@xml.value('(/*:BIGIMResponse/*:DaneZapytaniaFin/dane-id-kons/@imie)[1]','nvarchar(max)') 
      --and so on

--另一种方法是更通用的读取 EAV:

SELECT A.nds.value('local-name(.)','nvarchar(max)') AS ElementName
      ,B.attrs.value('local-name(.)','nvarchar(max)') AS AttributeName
      ,B.attrs.value('.','nvarchar(max)') AS AttributeValue
FROM @xml.nodes('//BIGIMResponse/DaneZapytaniaFin/*') A(nds)
CROSS APPLY A.nds.nodes('@*') B(attrs);

关于xml - 在 T-SQL 中解析包含多个 xmlns 的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54444014/

有关xml - 在 T-SQL 中解析包含多个 xmlns 的 xml的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  6. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  7. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  8. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  9. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  10. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

随机推荐