使用SQL从具有命名空间的XML节点提取结果
我有下面的XML,希望提取以下节点的值 1.后果 2.文件编号 3.成本要素代码使用SQL从具有命名空间的XML节点提取结果,sql,xml,namespaces,xquery,Sql,Xml,Namespaces,Xquery,我有下面的XML,希望提取以下节点的值 1.后果 2.文件编号 3.成本要素代码 <commitmentsResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <result xmlns="http://response.cim.its.test.edu.au/">SUCCESS</result>
<commitmentsResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<result xmlns="http://response.cim.its.test.edu.au/">SUCCESS</result>
<value xmlns="http://finance.response.cim.its.test.edu.au/">
<documentNumber xmlns="http://finance.cim.its.test.edu.au/">12345</documentNumber>
<lineNumber>2</lineNumber>
<costElementCode>costElementCode</costElementCode>
<internalOrderNumber>1000002</internalOrderNumber>
<costCentreCode>9999</costCentreCode>
<wbsCode>3000</wbsCode>
<lineDescription>2 packets of pencils</lineDescription>
<accountNumber>100000</accountNumber>
<itemAmount>105.5</itemAmount>
<fundsDueDate>2015-06-15</fundsDueDate>
</commitmentLine>
<commitmentLine xmlns="http://finance.cim.its.test.edu.au/">
<lineNumber>2</lineNumber>
<costElementCode>costElementCode</costElementCode>
<internalOrderNumber>1000002</internalOrderNumber>
<costCentreCode>9999</costCentreCode>
<wbsCode>3000</wbsCode>
<lineDescription>2 packets of pencils</lineDescription>
<accountNumber>100000</accountNumber>
<itemAmount>105.5</itemAmount>
<fundsDueDate>2015-06-15</fundsDueDate>
</commitmentLine>
</value>
</commitmentsResponse>
成功
12345
2.
成本要素代码
1000002
9999
3000
两包铅笔
100000
105.5
2015-06-15
2.
成本要素代码
1000002
9999
3000
两包铅笔
100000
105.5
2015-06-15
不使用名称空间:
DECLARE @myXML xml =
N'<commitmentsResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<result>SUCCESS</result>
<value>
<documentNumber>12345</documentNumber>
<commitmentLine>
<lineNumber>2</lineNumber>
<costElementCode>costElementCode</costElementCode>
<internalOrderNumber>1000002</internalOrderNumber>
<costCentreCode>9999</costCentreCode>
<wbsCode>3000</wbsCode>
<lineDescription>2 packets of pencils</lineDescription>
<accountNumber>100000</accountNumber>
<itemAmount>105.5</itemAmount>
<fundsDueDate>2015-06-15</fundsDueDate>
</commitmentLine>
<commitmentLine xmlns="http://finance.cim.its.test.edu.au/">
<lineNumber>2</lineNumber>
<costElementCode>costElementCode</costElementCode>
<internalOrderNumber>1000002</internalOrderNumber>
<costCentreCode>9999</costCentreCode>
<wbsCode>3000</wbsCode>
<lineDescription>2 packets of pencils</lineDescription>
<accountNumber>100000</accountNumber>
<itemAmount>105.5</itemAmount>
<fundsDueDate>2015-06-15</fundsDueDate>
</commitmentLine>
</value>
</commitmentsResponse>'
DECLARE @DocumentNumber INT
SELECT @DocumentNumber = [Table].[Column].value('documentNumber[1]', 'INT')
FROM @myXML.nodes('/commitmentsResponse/value') AS [Table]([Column])
DECLARE @Result VARCHAR(256)
SELECT @Result = [Table].[Column].value('result[1]', 'varchar(256)')
FROM @myXML.nodes('/commitmentsResponse') AS [Table]([Column])
DECLARE @CostElementCode VARCHAR(256)
SELECT @CostElementCode = [Table].[Column].value('costElementCode[1]', 'varchar(256)')
FROM @myXML.nodes('/commitmentsResponse/value/commitmentLine') AS [Table]([Column])
SELECT @Result
SELECT @DocumentNumber
SELECT @CostElementCode
DECLARE @myXML xml =
N'<commitmentsResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<result xmlns="http://response.cim.its.test.edu.au/">SUCCESS</result>
<value>
<documentNumber xmlns="http://finance.cim.its.test.edu.au/">12345</documentNumber>
<commitmentLine>
<lineNumber>2</lineNumber>
<costElementCode>costElementCode</costElementCode>
<internalOrderNumber>1000002</internalOrderNumber>
<costCentreCode>9999</costCentreCode>
<wbsCode>3000</wbsCode>
<lineDescription>2 packets of pencils</lineDescription>
<accountNumber>100000</accountNumber>
<itemAmount>105.5</itemAmount>
<fundsDueDate>2015-06-15</fundsDueDate>
</commitmentLine>
<commitmentLine xmlns="http://finance.cim.its.test.edu.au/">
<lineNumber>2</lineNumber>
<costElementCode>costElementCode</costElementCode>
<internalOrderNumber>1000002</internalOrderNumber>
<costCentreCode>9999</costCentreCode>
<wbsCode>3000</wbsCode>
<lineDescription>2 packets of pencils</lineDescription>
<accountNumber>100000</accountNumber>
<itemAmount>105.5</itemAmount>
<fundsDueDate>2015-06-15</fundsDueDate>
</commitmentLine>
</value>
</commitmentsResponse>'
DECLARE @DocumentNumber INT
;WITH XMLNAMESPACES (N'http://finance.cim.its.test.edu.au/' as DYN)
SELECT @DocumentNumber = c.value('(DYN:documentNumber)[1]', 'INT')
FROM @myXML.nodes('/commitmentsResponse/value') t(c)
DECLARE @Result VARCHAR(256)
;WITH XMLNAMESPACES (N'http://response.cim.its.test.edu.au/' as DYN)
SELECT @Result = c.value('(DYN:result)[1]', 'VARCHAR(256)')
FROM @myXML.nodes('/commitmentsResponse') t(c)
DECLARE @CostElementCode VARCHAR(256)
SELECT @CostElementCode = c.value('(costElementCode)[1]', 'VARCHAR(256)')
FROM @myXML.nodes('/commitmentsResponse/value/commitmentLine') t(c)
SELECT @Result
SELECT @DocumentNumber
SELECT @CostElementCode
DECLARE@myXML=
不
成功
12345
2.
成本要素代码
1000002
9999
3000
两包铅笔
100000
105.5
2015-06-15
2.
成本要素代码
1000002
9999
3000
两包铅笔
100000
105.5
2015-06-15
'
声明@DocumentNumber INT
选择@DocumentNumber=[Table].[Column].value('DocumentNumber[1],'INT'))
从@myXML.nodes('/commitmentsResponse/value')作为[表]([列])
声明@Result VARCHAR(256)
选择@Result=[Table].[Column].value('Result[1],'varchar(256)'))
从@myXML.nodes('/commitmentsResponse')作为[Table]([Column])
声明@CostElementCode VARCHAR(256)
选择@CostElementCode=[Table].[Column].value('CostElementCode[1]','varchar(256)'
从@myXML.nodes('/commitmentsResponse/value/commitmentLine')作为[表]([列])
选择@Result
选择@DocumentNumber
选择@CostElementCode
使用名称空间时:
DECLARE @myXML xml =
N'<commitmentsResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<result>SUCCESS</result>
<value>
<documentNumber>12345</documentNumber>
<commitmentLine>
<lineNumber>2</lineNumber>
<costElementCode>costElementCode</costElementCode>
<internalOrderNumber>1000002</internalOrderNumber>
<costCentreCode>9999</costCentreCode>
<wbsCode>3000</wbsCode>
<lineDescription>2 packets of pencils</lineDescription>
<accountNumber>100000</accountNumber>
<itemAmount>105.5</itemAmount>
<fundsDueDate>2015-06-15</fundsDueDate>
</commitmentLine>
<commitmentLine xmlns="http://finance.cim.its.test.edu.au/">
<lineNumber>2</lineNumber>
<costElementCode>costElementCode</costElementCode>
<internalOrderNumber>1000002</internalOrderNumber>
<costCentreCode>9999</costCentreCode>
<wbsCode>3000</wbsCode>
<lineDescription>2 packets of pencils</lineDescription>
<accountNumber>100000</accountNumber>
<itemAmount>105.5</itemAmount>
<fundsDueDate>2015-06-15</fundsDueDate>
</commitmentLine>
</value>
</commitmentsResponse>'
DECLARE @DocumentNumber INT
SELECT @DocumentNumber = [Table].[Column].value('documentNumber[1]', 'INT')
FROM @myXML.nodes('/commitmentsResponse/value') AS [Table]([Column])
DECLARE @Result VARCHAR(256)
SELECT @Result = [Table].[Column].value('result[1]', 'varchar(256)')
FROM @myXML.nodes('/commitmentsResponse') AS [Table]([Column])
DECLARE @CostElementCode VARCHAR(256)
SELECT @CostElementCode = [Table].[Column].value('costElementCode[1]', 'varchar(256)')
FROM @myXML.nodes('/commitmentsResponse/value/commitmentLine') AS [Table]([Column])
SELECT @Result
SELECT @DocumentNumber
SELECT @CostElementCode
DECLARE @myXML xml =
N'<commitmentsResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<result xmlns="http://response.cim.its.test.edu.au/">SUCCESS</result>
<value>
<documentNumber xmlns="http://finance.cim.its.test.edu.au/">12345</documentNumber>
<commitmentLine>
<lineNumber>2</lineNumber>
<costElementCode>costElementCode</costElementCode>
<internalOrderNumber>1000002</internalOrderNumber>
<costCentreCode>9999</costCentreCode>
<wbsCode>3000</wbsCode>
<lineDescription>2 packets of pencils</lineDescription>
<accountNumber>100000</accountNumber>
<itemAmount>105.5</itemAmount>
<fundsDueDate>2015-06-15</fundsDueDate>
</commitmentLine>
<commitmentLine xmlns="http://finance.cim.its.test.edu.au/">
<lineNumber>2</lineNumber>
<costElementCode>costElementCode</costElementCode>
<internalOrderNumber>1000002</internalOrderNumber>
<costCentreCode>9999</costCentreCode>
<wbsCode>3000</wbsCode>
<lineDescription>2 packets of pencils</lineDescription>
<accountNumber>100000</accountNumber>
<itemAmount>105.5</itemAmount>
<fundsDueDate>2015-06-15</fundsDueDate>
</commitmentLine>
</value>
</commitmentsResponse>'
DECLARE @DocumentNumber INT
;WITH XMLNAMESPACES (N'http://finance.cim.its.test.edu.au/' as DYN)
SELECT @DocumentNumber = c.value('(DYN:documentNumber)[1]', 'INT')
FROM @myXML.nodes('/commitmentsResponse/value') t(c)
DECLARE @Result VARCHAR(256)
;WITH XMLNAMESPACES (N'http://response.cim.its.test.edu.au/' as DYN)
SELECT @Result = c.value('(DYN:result)[1]', 'VARCHAR(256)')
FROM @myXML.nodes('/commitmentsResponse') t(c)
DECLARE @CostElementCode VARCHAR(256)
SELECT @CostElementCode = c.value('(costElementCode)[1]', 'VARCHAR(256)')
FROM @myXML.nodes('/commitmentsResponse/value/commitmentLine') t(c)
SELECT @Result
SELECT @DocumentNumber
SELECT @CostElementCode
DECLARE@myXML=
不
成功
12345
2.
成本要素代码
1000002
9999
3000
两包铅笔
100000
105.5
2015-06-15
2.
成本要素代码
1000002
9999
3000
两包铅笔
100000
105.5
2015-06-15
'
声明@DocumentNumber INT
;使用XMLNAMESPACES(N'http://finance.cim.its.test.edu.au/‘作为戴恩)
选择@DocumentNumber=c.value('(DYN:DocumentNumber)[1],'INT')
来自@myXML.nodes('/commitmentsResponse/value')t(c)
声明@Result VARCHAR(256)
;使用XMLNAMESPACES(N'http://response.cim.its.test.edu.au/‘作为戴恩)
选择@Result=c.value('(DYN:Result)[1],'VARCHAR(256)'
来自@myXML.nodes('/commitmentsResponse')t(c)
声明@CostElementCode VARCHAR(256)
选择@CostElementCode=c.value('(CostElementCode)[1],'VARCHAR(256)'
来自@myXML.nodes('/commitmentsResponse/value/commitmentLine')t(c)
选择@Result
选择@DocumentNumber
选择@CostElementCode
您是否使用任何特定的编程语言或DOM实现?是的,我希望使用SQLSQL任何特定的SQL实现?请添加相关标记,并在问题中指定一些细节以及您迄今为止所完成的工作。我使用了DECLARE@RESULTSET XML='12345';使用XMLNAMESPACES(“”作为s,“”作为a)选择@RESULTSET.value(“(/s:commitmentsResponse/a:value/documentNumber)[1],“varchar(max)”)Dev D:非常感谢,伙计,它工作得很好…非常感谢..我可以看到你已经将名称空间从节点中移除了.有没有一种方法我们可以拥有名称空间并获得结果呢。请看下面我的另一个答案。如果对您有效,请将其标记为答案。请将两个答案合并。在综合答案中,建议两种解决方案。@Mohitikri-上述答案对你不适用吗??如果它有效,请将其标记为答案,它也将帮助其他人。