我使用这个网站很长时间了,它多次帮助我解决了各种问题。 这次我卡住了。我尝试将一个复杂的 xml 导入到 ms-sql 表中。
<?xml version='1.0' encoding='UTF-8'?>
<S2SCTScf:SCTScfBlkCredTrf xmlns="urn:S2SCTScf:xsd:$SCTScfBlkCredTrf" xmlns:S2SCTScf="urn:S2SCTScf:xsd:$SCTScfBlkCredTrf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:S2SCTScf:xsd:$SCTScfBlkCredTrf SCTScfBlkCredTrf.xsd">
<S2SCTScf:SndgInst>XXXXXXXX</S2SCTScf:SndgInst>
<S2SCTScf:RcvgInst>YYYYYYYY</S2SCTScf:RcvgInst>
<S2SCTScf:SrvcId>SCT</S2SCTScf:SrvcId>
<S2SCTScf:TstCode>P</S2SCTScf:TstCode>
<S2SCTScf:FType>SCF</S2SCTScf:FType>
<S2SCTScf:FileRef>AAAAAAAAAAAAAAAAAAA</S2SCTScf:FileRef>
<S2SCTScf:RoutingInd>IND</S2SCTScf:RoutingInd>
<S2SCTScf:FileBusDt>2016-11-01</S2SCTScf:FileBusDt>
<S2SCTScf:FileCycleNo>01</S2SCTScf:FileCycleNo>
<S2SCTScf:FIToFICstmrCdtTrf xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.02">
<GrpHdr>
<MsgId>111111111111111111</MsgId>
<CreDtTm>2016-11-01T15:45:11.0Z</CreDtTm>
<NbOfTxs>11</NbOfTxs>
<TtlIntrBkSttlmAmt Ccy="EUR">111111</TtlIntrBkSttlmAmt>
<IntrBkSttlmDt>2016-11-01</IntrBkSttlmDt>
<SttlmInf>
<SttlmMtd>CLRG</SttlmMtd>
<ClrSys>
<Prtry>ST2</Prtry>
</ClrSys>
</SttlmInf>
<InstgAgt>
<FinInstnId>
<BIC>XXXXXXXX</BIC>
</FinInstnId>
</InstgAgt>
<InstdAgt>
<FinInstnId>
<BIC>XXXXXXXX</BIC>
</FinInstnId>
</InstdAgt>
</GrpHdr>
<CdtTrfTxInf>
<PmtId>
<EndToEndId>NOTPROVIDED</EndToEndId>
<TxId>XXXXXXXXXXXXXXXXXXXXXXXXXX</TxId>
</PmtId>
<PmtTpInf>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
</PmtTpInf>
<IntrBkSttlmAmt Ccy="XXX">1.00</IntrBkSttlmAmt>
<ChrgBr>SLEV</ChrgBr>
<Dbtr>
<Nm>MXXXXXX XXXXXXX</Nm>
<PstlAdr>
<Ctry>XX</Ctry>
<AdrLine>XXXXXXXXXXXXXXXXXXXXXXXXXXX</AdrLine>
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXX</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>XXXXXXXXXXXXXXXXXXXXXXX</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</CdtrAcct>
<RmtInf>
<Ustrd>XXXXXXXXXXXXXXXXXXXXXXX</Ustrd>
</RmtInf>
</CdtTrfTxInf>
<CdtTrfTxInf>
<PmtId>
<EndToEndId>NOTPROVIDED</EndToEndId>
<TxId>XXXXXXXXXXXXXXXXXXXXXXXXXXXX</TxId>
</PmtId>
<PmtTpInf>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
</PmtTpInf>
<IntrBkSttlmAmt Ccy="XXX">1.00</IntrBkSttlmAmt>
<ChrgBr>SLEV</ChrgBr>
<Dbtr>
<Nm>XXXXXXXXXXXXXXXXX</Nm>
<PstlAdr>
<Ctry>XX</Ctry>
<AdrLine>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</AdrLine>
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXXXXXXXXXXXXXXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXXXXXXXXXXXXXXX</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>XXXXXXXXXXXXXXXXXXXXXXXX</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</CdtrAcct>
<RmtInf>
<Ustrd>XXXXXXXXXXXXXXXXXXXXXXXXXXXXX</Ustrd>
</RmtInf>
</CdtTrfTxInf>
</S2SCTScf:FIToFICstmrCdtTrf>
</S2SCTScf:SCTScfBlkCredTrf>
我尝试了 OPENXML 和 XQuery 函数,但我在声明和使用命名空间(或命名空间uri)时遇到了一些问题。我不熟悉这种复杂的 xml 和 namespaceuri。我需要一个 ideea 来获取表中的数据。我成功地使用了更简单的 xml,即使只有一个命名空间。我已经手动删除了前 11 行,下面的选择工作得很好......
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
SELECT @XML = XMLData FROM XMLwithOpenXML where id=6 --this is the xml without first 11 lines
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT * FROM OPENXML(@hDoc, 'FIToFICstmrCdtTrf/CdtTrfTxInf')
WITH
(
CCY [varchar](100) 'IntrBkSttlmAmt/@Ccy',
IntrBkSttlmAmt [varchar](100) 'IntrBkSttlmAmt',
TxId [varchar](100) 'PmtId/TxId',
EndToEndId [varchar](100) 'PmtId/EndToEndId',
ChrgBr [varchar](100) 'ChrgBr'
--etc
)
EXEC sp_xml_removedocument @hDoc
GO
最佳答案
先说几点
FROM OPENXML已过时,不应再使用(极少数异常(exception)退出)<?xml version=''1.0'' encoding=''UTF-8''?> .这迫使你去 VARCHAR -path,这在与非纯拉丁字符的连接中是危险的。最好将其替换为 utf-16然后去 NVARCHAR -小路。在这种情况下,您必须在您的 XML 文字前面设置一个“N”。*:。在每个元素的前面。S2SCTScf:FIToFICstmrCdtTrf定义一个新的默认命名空间。我用 innerDeflt 作为别名.这是变量声明
DECLARE @xml XML=
'<?xml version=''1.0'' encoding=''UTF-8''?>
<S2SCTScf:SCTScfBlkCredTrf xmlns="urn:S2SCTScf:xsd:$SCTScfBlkCredTrf" xmlns:S2SCTScf="urn:S2SCTScf:xsd:$SCTScfBlkCredTrf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:S2SCTScf:xsd:$SCTScfBlkCredTrf SCTScfBlkCredTrf.xsd">
<S2SCTScf:SndgInst>XXXXXXXX</S2SCTScf:SndgInst>
<S2SCTScf:RcvgInst>YYYYYYYY</S2SCTScf:RcvgInst>
<S2SCTScf:SrvcId>SCT</S2SCTScf:SrvcId>
<S2SCTScf:TstCode>P</S2SCTScf:TstCode>
<S2SCTScf:FType>SCF</S2SCTScf:FType>
<S2SCTScf:FileRef>AAAAAAAAAAAAAAAAAAA</S2SCTScf:FileRef>
<S2SCTScf:RoutingInd>IND</S2SCTScf:RoutingInd>
<S2SCTScf:FileBusDt>2016-11-01</S2SCTScf:FileBusDt>
<S2SCTScf:FileCycleNo>01</S2SCTScf:FileCycleNo>
<S2SCTScf:FIToFICstmrCdtTrf xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.02">
<GrpHdr>
<MsgId>111111111111111111</MsgId>
<CreDtTm>2016-11-01T15:45:11.0Z</CreDtTm>
<NbOfTxs>11</NbOfTxs>
<TtlIntrBkSttlmAmt Ccy="EUR">111111</TtlIntrBkSttlmAmt>
<IntrBkSttlmDt>2016-11-01</IntrBkSttlmDt>
<SttlmInf>
<SttlmMtd>CLRG</SttlmMtd>
<ClrSys>
<Prtry>ST2</Prtry>
</ClrSys>
</SttlmInf>
<InstgAgt>
<FinInstnId>
<BIC>XXXXXXXX</BIC>
</FinInstnId>
</InstgAgt>
<InstdAgt>
<FinInstnId>
<BIC>XXXXXXXX</BIC>
</FinInstnId>
</InstdAgt>
</GrpHdr>
<CdtTrfTxInf>
<PmtId>
<EndToEndId>NOTPROVIDED</EndToEndId>
<TxId>XXXXXXXXXXXXXXXXXXXXXXXXXX</TxId>
</PmtId>
<PmtTpInf>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
</PmtTpInf>
<IntrBkSttlmAmt Ccy="XXX">1.00</IntrBkSttlmAmt>
<ChrgBr>SLEV</ChrgBr>
<Dbtr>
<Nm>MXXXXXX XXXXXXX</Nm>
<PstlAdr>
<Ctry>XX</Ctry>
<AdrLine>XXXXXXXXXXXXXXXXXXXXXXXXXXX</AdrLine>
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXX</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>XXXXXXXXXXXXXXXXXXXXXXX</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</CdtrAcct>
<RmtInf>
<Ustrd>XXXXXXXXXXXXXXXXXXXXXXX</Ustrd>
</RmtInf>
</CdtTrfTxInf>
<CdtTrfTxInf>
<PmtId>
<EndToEndId>NOTPROVIDED</EndToEndId>
<TxId>XXXXXXXXXXXXXXXXXXXXXXXXXXXX</TxId>
</PmtId>
<PmtTpInf>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
</PmtTpInf>
<IntrBkSttlmAmt Ccy="XXX">1.00</IntrBkSttlmAmt>
<ChrgBr>SLEV</ChrgBr>
<Dbtr>
<Nm>XXXXXXXXXXXXXXXXX</Nm>
<PstlAdr>
<Ctry>XX</Ctry>
<AdrLine>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</AdrLine>
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXXXXXXXXXXXXXXX</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>XXXXXXXXXXXXXXXXXXXXXXXX</BIC>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>XXXXXXXXXXXXXXXXXXXXXXXX</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>XXXXXXXXXXXXXXXXXXXXXXXXXX</IBAN>
</Id>
</CdtrAcct>
<RmtInf>
<Ustrd>XXXXXXXXXXXXXXXXXXXXXXXXXXXXX</Ustrd>
</RmtInf>
</CdtTrfTxInf>
</S2SCTScf:FIToFICstmrCdtTrf>
</S2SCTScf:SCTScfBlkCredTrf>';
这是查询:首先声明所有命名空间。您的节点是纯结构化的 1:1,因此只需在构成 XPath 的元素名称后添加元素名称即可读取它们.只有<CdtTrfTxInf>出现两次需要 1:n-approach与 APPLY和 .nodes() .
在我的示例中,您将获得一个模板,用于隐藏在 XML 中的任何类型的数据。剩下的就看你了。
WITH XMLNAMESPACES(DEFAULT 'urn:S2SCTScf:xsd:$SCTScfBlkCredTrf'
,'urn:S2SCTScf:xsd:$SCTScfBlkCredTrf' as S2SCTScf
,'http://www.w3.org/2001/XMLSchema-instance' AS xsi
,'urn:S2SCTScf:xsd:$SCTScfBlkCredTrf SCTScfBlkCredTrf.xsd' AS schemaLocation
,'urn:iso:std:iso:20022:tech:xsd:pacs.008.001.02' AS innerDeflt)
SELECT rt.value(N'(S2SCTScf:SndgInst)[1]','nvarchar(max)') AS SndgInst
,rt.value(N'(S2SCTScf:RcvgInst)[1]','nvarchar(max)') AS RcvgInst
--more like this
,rt.value(N'(S2SCTScf:FIToFICstmrCdtTrf/innerDeflt:GrpHdr/innerDeflt:MsgId)[1]','nvarchar(max)') AS MsgId
,rt.value(N'(S2SCTScf:FIToFICstmrCdtTrf/innerDeflt:GrpHdr/innerDeflt:CreDtTm)[1]','datetime') AS CreDtTm
--more like this
,rt.value(N'(S2SCTScf:FIToFICstmrCdtTrf/innerDeflt:GrpHdr/innerDeflt:TtlIntrBkSttlmAmt/@Ccy)[1]','nvarchar(max)') AS TtlIntrBkSttlmAmt_Ccy
,rt.value(N'(S2SCTScf:FIToFICstmrCdtTrf/innerDeflt:GrpHdr/innerDeflt:TtlIntrBkSttlmAmt)[1]','int') AS TtlIntrBkSttlmAmt
--all nodes are 1:1, just "more of the same"
--But CdtTrfTxInf is there twice, therefore the call to OUTER APPLY rt.nodes()
,cti.value(N'(innerDeflt:PmtId/innerDeflt:EndToEndId)[1]','nvarchar(max)') AS EndToEndId
--all the rest is following the same schema...
FROM @xml.nodes(N'S2SCTScf:SCTScfBlkCredTrf') AS A(rt) --root
OUTER APPLY rt.nodes(N'S2SCTScf:FIToFICstmrCdtTrf/innerDeflt:CdtTrfTxInf') AS B(cti) --CdtTrfTxInf
部分结果(字幕移位...)
SndgInst RcvgInst MsgId CreDtTm TtlIntrBkSttlmAmt_Ccy TtlIntrBkSttlmAmt EndToEndId
XXXXXXXX YYYYYYYY 111111111111111111 2016-11-01 15:45:11.000 EUR 111111 NOTPROVIDED
XXXXXXXX YYYYYYYY 111111111111111111 2016-11-01 15:45:11.000 EUR 111111 NOTPROVIDED
关于sql - OPENXML 将 xml 导入 ms sql - 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41745920/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba
我在尝试使用Nokogiri构建XML文档时遇到了一个小问题。我想将我的元素之一称为“文本”(请参阅下面粘贴代码的最底部)。通常,要创建一个新元素,我会执行类似以下的操作xml.text--但它似乎是.text是Nokogiri已经用来做其他事情的方法。因此,当我写这行时xml.textNokogiri没有创建名为的新元素但只是写了意味着成为元素内容的文本。我怎样才能让Nokogiri实际制作一个名为的元素??builder=Nokogiri::XML::Builder.newdo|xml|xml.TEI("xmlns"=>"http://www.tei-c.org/ns/1.0"
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'